জাভাতে সিনথেটিক শ্রেণি কী? কেন এটি ব্যবহার করা উচিত? আমি কীভাবে এটি ব্যবহার করতে পারি?
জাভাতে সিনথেটিক শ্রেণি কী? কেন এটি ব্যবহার করা উচিত? আমি কীভাবে এটি ব্যবহার করতে পারি?
উত্তর:
উদাহরণস্বরূপ, যখন আপনার একটি স্যুইচ স্টেটমেন্ট থাকে, জাভা একটি পরিবর্তনশীল তৈরি করে যা একটি with দিয়ে শুরু হয় $ আপনি যদি এর উদাহরণ দেখতে চান তবে জাভা প্রতিবিম্বটি একটি শ্রেণীর কাছে দেখুন যাতে এটিতে একটি স্টিচ স্টেটমেন্ট থাকে। ক্লাসের যে কোনও জায়গায় আপনার কমপক্ষে একটি সুইচ স্টেটমেন্ট থাকলে আপনি এই ভেরিয়েবলগুলি দেখতে পাবেন।
আপনার প্রশ্নের উত্তর দেওয়ার জন্য, আমি বিশ্বাস করি না যে আপনি সিন্থেটিক ক্লাসগুলিতে (প্রতিচ্ছবি ব্যতীত) অ্যাক্সেস করতে সক্ষম হয়েছেন।
আপনি যদি এমন কোনও শ্রেণীর বিশ্লেষণ করছেন যা আপনি (প্রতিবিম্বের মাধ্যমে) সম্পর্কে কিছু জানেন না এবং সেই শ্রেণিটি সম্পর্কে খুব সুনির্দিষ্ট এবং নিম্ন-স্তরের জিনিসগুলি জানা প্রয়োজন, আপনি জাভা প্রতিবিম্ব পদ্ধতিগুলি ব্যবহার করতে পারেন যা সিন্থেটিক ক্লাসগুলির সাথে করতে হবে। আপনার কোডটিতে যথাযথভাবে ব্যবহার করার জন্য এখানে কেবলমাত্র "ব্যবহার" ক্লাস সম্পর্কে আরও তথ্য পাবেন।
(আপনি যদি এটি করেন তবে আপনি সম্ভবত কিছু বিকাশকারী কাঠামো তৈরি করছেন যা অন্য বিকাশকারীরা ব্যবহার করতে পারেন))
অন্যথায়, আপনি যদি প্রতিবিম্ব ব্যবহার না করে থাকেন তবে সিন্থেটিক ক্লাসগুলির ব্যবহারিক ব্যবহার নেই যা আমি জানি।
জাভা রানটাইমে ক্লাস তৈরি করার ক্ষমতা রাখে। এই ক্লাসগুলি সিন্থেটিক ক্লাস বা ডায়নামিক প্রক্সি হিসাবে পরিচিত।
আরও তথ্যের জন্য http://java.sun.com/j2se/1.5.0/docs/guide/reflection/proxy.html দেখুন ।
অন্যান্য ওপেন সোর্স লাইব্রেরি যেমন সিজিএলআইবি এবং এএসএম আপনাকে সিনথেটিক ক্লাস তৈরি করার অনুমতি দেয় সরবরাহিত লাইব্রেরির চেয়ে আরও শক্তিশালী।
সিন্থেটিক ক্লাসগুলি এওপি (অ্যাসপেক্ট ওরিয়েন্টেড প্রোগ্রামিং) লাইব্রেরি যেমন স্প্রিং এওপি এবং অ্যাসপেক্টজে, পাশাপাশি হাইবারনেটের মতো ওআরএম লাইব্রেরি দ্বারা ব্যবহৃত হয়।
Proxy.newProxyInstance(Runnable.class.getClassLoader(), new Class[]{Runnable.class}, (proxy, method, args1) -> null).getClass().isSynthetic() == false
java.lang.reflect.Member#isSynthetic
বলেছেন: এই সদস্যটি সংকলক দ্বারা প্রবর্তিত হলে সত্য
java.lang.reflect.Member#isSynthetic
মূল প্রশ্নের সাথে অপ্রাসঙ্গিক। সদস্যরা ক্ষেত্র, নির্মাতা এবং পদ্ধতি। আসল প্রশ্নটি সিন্থেটিক ক্লাস সম্পর্কে ছিল , সিন্থেটিক মেম্বার নয়। জাভা 8-এ, ল্যাম্বডা এক্সপ্রেশনগুলি সিন্থেটিক ক্লাসগুলিকে জন্ম দেয় - আমি নিশ্চিত নই যে তারা কী কী পরিস্থিতিতে উঠতে পারে।
ভাল আমি গুগলে প্রথম প্রশ্নের উত্তর পেয়েছি:
কোনও শ্রেণি সংকলক হিসাবে চিহ্নিত করা যেতে পারে যদি এটি সংকলক দ্বারা উত্পন্ন হয়, অর্থাত্, এটি উত্স কোডে উপস্থিত হয় না।
এটি কেবলমাত্র একটি প্রাথমিক সংজ্ঞা তবে আমি এটি একটি ফোরামের থ্রেডে পেয়েছি এবং এর কোনও ব্যাখ্যা নেই। এখনও আরও ভাল একটি সন্ধান করছেন ...
সিন্থেটিক ক্লাস / পদ্ধতি / ক্ষেত্র:
এই জিনিসগুলি ভিএম এর জন্য গুরুত্বপূর্ণ। নিম্নলিখিত কোড স্নিপেট এক নজরে দেখুন:
class MyOuter {
private MyInner inner;
void createInner() {
// The Compiler has to create a synthetic method
// to construct a new MyInner because the constructor
// is private.
// --> synthetic "constructor" method
inner = new MyInner();
// The Compiler has to create a synthetic method
// to doSomething on MyInner object because this
// method is private.
// --> synthetic "doSomething" method
inner.doSomething();
}
private class MyInner {
// the inner class holds a syntetic ref_pointer to
// the outer "parent" class
// --> synthetic field
private MyInner() {
}
private void doSomething() {
}
}
}
এই আলোচনা অনুসারে , যদিও ভাষা স্পেসিফিকেশন ক্লাসগুলির জন্য "ইসসেন্টিথিক" প্রপ্রেটি বর্ণনা করে, বাস্তবায়নের দ্বারা এটি একেবারেই উপেক্ষা করা হয় এবং গতিশীল প্রক্সি বা বেনাম শ্রেণীর জন্য ব্যবহৃত হয় না। সিন্থেটিক ফিল্ডস এবং কনস্ট্রাক্টরগুলি নেস্টেড ক্লাসগুলি বাস্তবায়নের জন্য ব্যবহৃত হয় (কেবল উত্স কোডে বাইট কোডে নেস্টেড ক্লাসগুলির ধারণা নেই)।
আমি মনে করি সিনথেটিক শ্রেণির ধারণাটি কেবল কার্যকরভাবে প্রমাণিত হয়নি, অর্থাত কোনও শ্রেণি সিন্থেটিক কিনা তা কেউই পাত্তা দেয় না। ক্ষেত্র এবং পদ্ধতিগুলির সাহায্যে এটি সম্ভবত এক জায়গায় ব্যবহার করা হয়েছে: কোনও IDE শ্রেণীর কাঠামো দর্শনটিতে কী প্রদর্শিত হবে তা নির্ধারণ করার জন্য - আপনি সেখানে সাধারণ পদ্ধতি এবং ক্ষেত্রগুলি দেখানোর জন্য চান তবে নেস্টেড ক্লাসগুলি সিমুলেট করার জন্য ব্যবহৃত সিন্থেটিকগুলি নয়। OTOH, আপনি বেনামে ক্লাস সেখানে প্রদর্শন করতে চান।
এগুলি চালনার সময়ে জেভিএম দ্বারা তৈরি করা হয় যখন তারা ডিবাগিংয়ের উদ্দেশ্যে অভ্যন্তরীণ শ্রেণির ব্যক্তিগত সদস্যদের ডাকে
কার্যকর করার উদ্দেশ্যে রানও সময়কালে জেভিএম দ্বারা তৈরি পদ্ধতি, ক্ষেত্রগুলি, শ্রেণিগুলি সিন্থেটিক বলে
http://www.javaworld.com/article/2073578/java-s-synthetic-methods.html
http://javapapers.com/core-java/java-synthetic-class-method-field/
এছাড়াও রানটাইমে ইন্টারফেস বা অ্যাবস্ট্রাক্ট ক্লাসগুলির বাস্তবায়ন তৈরি করতে ইজিমক দ্বারা সিন্থেটিক ক্লাস বা ডায়নামিক প্রক্সিগুলি ব্যবহৃত হয়।
যখন জাভা সংকলক নির্দিষ্ট নির্মাণগুলি যেমন অভ্যন্তরীণ শ্রেণীর সংকলন করে, তখন এটি সিন্থেটিক কনস্ট্রাক্টস তৈরি করে ; এগুলি হল শ্রেণি, পদ্ধতি, ক্ষেত্র এবং অন্যান্য কনস্ট্রাক্টস যা উত্স কোডে সম্পর্কিত কনস্ট্রাক্ট নেই।
ব্যবহারসমূহ:
সিন্থেটিক কনস্ট্রাক্টসগুলি জাভা সংকলকগুলিকে JVM এ পরিবর্তন না করে নতুন জাভা ভাষার বৈশিষ্ট্যগুলি প্রয়োগ করতে সক্ষম করে। তবে, বিভিন্ন জাভা সংকলক প্রয়োগের মধ্যে সিন্থেটিক কনস্ট্রাক্ট বিভিন্ন পরিবর্তিত হতে পারে যার অর্থ .class ফাইলগুলি বিভিন্ন বাস্তবায়নের মধ্যেও পরিবর্তিত হতে পারে।
তথ্যসূত্র: docs.oracle.com
যেমন বিভিন্ন উত্তর ইতিমধ্যে চিহ্নিত করেছে, সংকলকটি বিভিন্ন কনস্ট্রাক্ট (ক্লাস সহ) উত্পন্ন করার অনুমতি দেয় যা সোস কোডের কোনও কিছুর সাথে সরাসরি মিল নেই correspond এগুলি সিন্থেটিক হিসাবে চিহ্নিত করতে হবে:
কোনও শ্রেণি বা ইন্টারফেসের জন্য বাইনারি উপস্থাপনে নিম্নলিখিত সমস্তগুলি অবশ্যই উপস্থিত থাকতে পারে:
[...]
১১. জাভা সংকলক দ্বারা নির্গত কোন নির্মাণটি অবশ্যই সংশ্লেষিত হিসাবে চিহ্নিত করতে হবে যদি এটি উত্স কোডে সুস্পষ্টভাবে বা স্পষ্টভাবে ঘোষিত কোনও নির্মাণের সাথে সামঞ্জস্য না হয় 11. , যদি না নির্গত নির্মাণ একটি শ্রেণি সূচনা পদ্ধতি (JVMS §2.9) না হয়।
[...]
অন্য প্রশ্নে একটি মন্তব্যে @ হোলজার দ্বারা চিহ্নিত হিসাবে , এ জাতীয় নির্মাণের জন্য প্রাসঙ্গিক উদাহরণগুলি পদ্ধতি রেফারেন্স এবং ল্যাম্বডাসকে উপস্থাপন করে এমন শ্রেণি অবজেক্টগুলি:
System.out.println(((Runnable) System.out::println).getClass().isSynthetic());
System.out.println(((Runnable) () -> {}).getClass().isSynthetic());
আউটপুট:
true
true
যদিও এটি সুস্পষ্টভাবে উল্লেখ করা হয়নি, এটি 15.27.4 থেকে অনুসরণ করে । ল্যাম্বদা এক্সপ্রেশনগুলির রান-টাইম মূল্যায়ন :
ল্যাম্বডা এক্সপ্রেশনটির মান হ'ল নিম্নলিখিত বৈশিষ্ট্যগুলি সহ কোনও শ্রেণীর উদাহরণের জন্য একটি রেফারেন্স: [...]
এবং পদ্ধতি রেফারেন্সগুলির জন্য প্রায় অভিন্ন শব্দ ( 15.13.3। পদ্ধতি রেফারেন্সগুলির রান-টাইম মূল্যায়ন )।
এই শ্রেণিটি উত্স কোডে কোথাও স্পষ্টভাবে উল্লেখ করা হয়নি, তাই এটি সিন্থেটিক হতে হবে।
যদি আমি এটি সঠিকভাবে পাই তবে একটি সিন্থেটিক শ্রেণি ফ্লাইতে উত্পন্ন হয়, এটি একটি স্পষ্ট নাম না দিয়ে। উদাহরণ স্বরূপ:
//...
Thread myThread = new Thread() {
public void run() {
// do something ...
}
};
myThread.start();
//...
এটি থ্রেডের একটি সিন্থেটিক সাবক্লাস তৈরি করে এবং তার রান () পদ্ধতিটি ওভাররাইড করে, তারপরে এটি ইনস্ট্যান্ট করে এটিকে শুরু করে।
Outer$1.class
।
জাভাতে সিনথেটিক শ্রেণি কী?
একটি synthetic
ক্লাস জাভা কম্পাইলার.class
দ্বারা উত্পাদিত একটি ফাইল এবং এটি উত্স কোডে বিদ্যমান নেই।
synthetic
শ্রেণীর ব্যবহারের উদাহরণ : বেনামে অভ্যন্তর শ্রেণি
synthetic
শ্রেণি এবং এটি java.text.DizzList এর ভিতরে একটি বেনামে অভ্যন্তর শ্রেণিDigitList$1.java
তবে এটি একটি অভ্যন্তরীণ ফাইলDigitList.java
কেন এটি ব্যবহার করা উচিত?
এটি .class
ফাইল তৈরির জন্য জাভা সংকলক যুক্তির ভিতরে একটি প্রক্রিয়া
আমি কীভাবে এটি ব্যবহার করতে পারি?
না, বিকাশকারীরা তা করেন না এটা সরাসরি ব্যবহার করুন।
জাভা সংকলক ফাইল synthetic
উত্পন্ন করতে ব্যবহার .class
করুন এবং তারপরে JVM পড়ুন.class
প্রোগ্রামটির যুক্তি ফাইলটি ।
সিনথেটিক কনস্ট্রাক্টস হ'ল ক্লাস, পদ্ধতি, ক্ষেত্র ইত্যাদি যা উত্স কোডে সংশ্লিষ্ট কাঠামো নেই। সিন্থেটিক কনস্ট্রাক্টসগুলি জাভা সংকলকগুলিকে জেভিএম পরিবর্তন না করে নতুন জাভা ভাষার বৈশিষ্ট্যগুলি প্রয়োগ করতে সক্ষম করে। যাইহোক, বিভিন্ন জাভা সংকলক প্রয়োগের মধ্যে সিন্থেটিক কনস্ট্রাক্ট বিভিন্ন পরিবর্তিত হতে পারে যার অর্থ .class ফাইলগুলিও বিভিন্ন বাস্তবায়নের মধ্যে পরিবর্তিত হতে পারে।
একটি সিন্থেটিক শ্রেণি আপনার কোডে উপস্থিত হয় না: এটি সংকলক দ্বারা তৈরি করা হয়। যেমন জাভাতে সংকলক দ্বারা তৈরি একটি ব্রিজ পদ্ধতি সাধারণত কৃত্রিম।
public class Pair<T> {
private T first;
private T second;
public void setSecond(T newValue) {
second = newValue;
}
}
public class DateInterval extends Pair<String> {
public void setSecond(String second) {
System.out.println("OK sub");
}
public static void main(String[] args) throws NoSuchFieldException, SecurityException {
DateInterval interval = new DateInterval();
Pair pair = interval;
pair.setSecond("string1");
}
}
কমান্ডটি ব্যবহার করে javap -verbose DateInterval
, আপনি একটি সেতু পদ্ধতি দেখতে পাবেন:
public void setSecond(java.lang.Object);
flags: ACC_PUBLIC, ACC_BRIDGE, ACC_SYNTHETIC
এটি সংকলক দ্বারা তৈরি করা হয়েছিল; এটি আপনার কোডে উপস্থিত হয় না।