जावा में सिंथेटिक क्लास क्या है? इसका उपयोग क्यों किया जाना चाहिए? मुझे इसे कैसे प्रयोग में लाना है?
जावा में सिंथेटिक क्लास क्या है? इसका उपयोग क्यों किया जाना चाहिए? मुझे इसे कैसे प्रयोग में लाना है?
जवाबों:
उदाहरण के लिए, जब आपके पास एक स्विच स्टेटमेंट होता है, तो जावा एक वैरिएबल बनाता है जो $ से शुरू होता है। यदि आप इसका एक उदाहरण देखना चाहते हैं, तो उस वर्ग के जावा प्रतिबिंब में झांकना जिसमें उसका स्विच स्टेटमेंट है। जब आप कक्षा में कहीं भी कम से कम एक स्विच स्टेटमेंट रखते हैं, तो आप इन चरों को देखेंगे।
आपके प्रश्न का उत्तर देने के लिए, मेरा मानना है कि आप सिंथेटिक कक्षाओं में (प्रतिबिंब के अलावा) का उपयोग करने में सक्षम हैं।
यदि आप एक ऐसे वर्ग का विश्लेषण कर रहे हैं जिसके बारे में आपको कुछ भी पता नहीं है (प्रतिबिंब के माध्यम से) और उस वर्ग के बारे में बहुत विशिष्ट और निम्न-स्तरीय चीजों को जानने की जरूरत है, तो आप जावा प्रतिबिंब विधियों का उपयोग करके समाप्त हो सकते हैं जो सिंथेटिक कक्षाओं के साथ करना है। यहां केवल "उपयोग" को अपने कोड में उचित रूप से उपयोग करने के लिए वर्ग के बारे में अधिक जानकारी प्राप्त करना है।
(यदि आप ऐसा कर रहे हैं, तो आप शायद कुछ प्रकार के ढांचे का निर्माण कर रहे हैं जो अन्य डेवलपर्स उपयोग कर सकते हैं।)
अन्यथा, यदि आप प्रतिबिंब का उपयोग नहीं कर रहे हैं, तो सिंथेटिक कक्षाओं का कोई व्यावहारिक उपयोग नहीं है जो मुझे पता है।
जावा में रनटाइम पर कक्षाएं बनाने की क्षमता है। इन वर्गों को सिंथेटिक क्लास या डायनेमिक प्रॉक्सी के रूप में जाना जाता है।
अधिक जानकारी के लिए 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
मूल प्रश्न के लिए javadoc अप्रासंगिक है। सदस्य क्षेत्र, निर्माता और विधियाँ हैं। मूल प्रश्न सिंथेटिक कक्षाओं के बारे में था , न कि सिंथेटिक सदस्यों के बारे में। जावा 8 में, लैम्ब्डा अभिव्यक्तियाँ सिंथेटिक कक्षाओं को जन्म देती हैं - मुझे यकीन नहीं है कि वे और कौन सी परिस्थितियाँ पैदा कर सकते हैं।
वैसे मुझे Google पर पहले प्रश्न का उत्तर मिला:
एक वर्ग को सिंथेटिक के रूप में चिह्नित किया जा सकता है यदि यह संकलक द्वारा उत्पन्न होता है, अर्थात यह स्रोत कोड में प्रकट नहीं होता है।
यह सिर्फ एक मूल परिभाषा है लेकिन मैंने इसे एक फोरम थ्रेड में पाया और कोई स्पष्टीकरण नहीं था। फिर भी एक बेहतर की तलाश ...
सिंथेटिक कक्षाएं / तरीके / क्षेत्र:
ये चीजें VM के लिए महत्वपूर्ण हैं। निम्नलिखित कोड स्निपेट पर एक नज़र डालें:
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() {
}
}
}
इस चर्चा के अनुसार , हालांकि, भाषा विनिर्देश वर्गों के लिए एक "SStthetic "भविष्यवाणी का वर्णन करता है, लेकिन यह कार्यान्वयन द्वारा बहुत अधिक अनदेखा किया जाता है और गतिशील प्रॉक्सी या अनाम कक्षाओं के लिए उपयोग नहीं किया जाता है। नेस्टेड कक्षाओं को लागू करने के लिए सिंथेटिक फ़ील्ड और कंस्ट्रक्टर का उपयोग किया जाता है (बाइट कोड में नेस्टेड क्लास की अवधारणा नहीं है, केवल स्रोत कोड में)।
मुझे लगता है कि सिंथेटिक कक्षाओं की अवधारणा केवल उपयोगी साबित नहीं हुई है, अर्थात कोई भी परवाह नहीं करता है कि कोई वर्ग सिंथेटिक है या नहीं। फ़ील्ड और विधियों के साथ, इसका उपयोग संभवतः एक ही स्थान पर किया जाता है: यह निर्धारित करने के लिए कि IDE क्लास संरचना दृश्य में क्या दिखाना है - आप सामान्य तरीके और फ़ील्ड दिखाना चाहते हैं, लेकिन सिंथेटिक लोग नेस्टेड कक्षाओं का अनुकरण नहीं करते थे। OTOH, आप अनाम कक्षाओं को दिखाना चाहते हैं।
वे JVM द्वारा उस समय बनाए जाते हैं जब वे डीबगिंग उद्देश्य के लिए आंतरिक वर्ग के निजी सदस्यों को आमंत्रित करते हैं
इसके निष्पादन उद्देश्य के लिए रन टाइम के दौरान जेवीएम द्वारा बनाई गई विधियों, क्षेत्रों, वर्ग को सिंथेटिक कहा जाता है
http://www.javaworld.com/article/2073578/java-s-synthetic-methods.html
http://javapapers.com/core-java/java-synthetic-class-method-field/
रनटाइम पर इंटरफेस या अमूर्त कक्षाओं के कार्यान्वयन को बनाने के लिए ईज़ीमॉक द्वारा सिंथेटिक क्लास या डायनेमिक प्रॉक्सी का भी उपयोग किया जाता है।
जब जावा कंपाइलर कुछ निर्माणों को संकलित करता है, जैसे कि आंतरिक वर्ग, तो यह सिंथेटिक निर्माण बनाता है ; ये वर्ग, विधियाँ, फ़ील्ड्स और अन्य निर्माण हैं जिनके स्रोत कोड में संबंधित निर्माण नहीं है।
उपयोग:
सिंथेटिक निर्माण जावा संकलक को जेवीएम में बदलाव के बिना नई जावा भाषा सुविधाओं को लागू करने में सक्षम बनाते हैं। हालांकि, सिंथेटिक निर्माण विभिन्न जावा कंपाइलर कार्यान्वयन के बीच भिन्न हो सकते हैं, जिसका अर्थ है कि .class फाइलें अलग-अलग कार्यान्वयन के बीच भी भिन्न हो सकती हैं।
संदर्भ: docs.oracle.com
जैसा कि विभिन्न उत्तर पहले ही इंगित कर चुके हैं, संकलक को विभिन्न निर्माणों (कक्षाओं सहित) को उत्पन्न करने की अनुमति है जो सीधे मेमोरी कोड में कुछ के अनुरूप नहीं हैं। इन्हें सिंथेटिक के रूप में चिह्नित किया जाना है:
एक वर्ग या इंटरफ़ेस के लिए एक द्विआधारी प्रतिनिधित्व में निम्नलिखित सभी शामिल होने चाहिए:
[...]
11. जावा कंपाइलर द्वारा उत्सर्जित एक निर्माण को सिंथेटिक के रूप में चिह्नित किया जाना चाहिए यदि यह स्रोत कोड में स्पष्ट रूप से या अंतर्निहित रूप से घोषित निर्माण के अनुरूप नहीं है। , जब तक उत्सर्जित निर्माण एक वर्ग आरंभीकरण विधि (JVMS )2.9) है।
[...]
जैसा कि @Holger द्वारा एक अन्य प्रश्न के लिए एक टिप्पणी में बताया गया है , ऐसे निर्माणों के लिए प्रासंगिक उदाहरण विधि संदर्भ और लंबोदर का प्रतिनिधित्व करने वाली कक्षा वस्तुएं हैं:
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
।
एक सिंथेटिक वर्ग आपके कोड में नहीं दिखाई देता है: यह कंपाइलर द्वारा बनाया गया है। उदा। जावा में कंपाइलर द्वारा बनाई गई एक पुल विधि आमतौर पर सिंथेटिक होती है।
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
यह संकलक द्वारा बनाया गया था; यह आपके कोड में दिखाई नहीं देता है।
जावा में सिंथेटिक क्लास क्या है?
एक synthetic
क्लास जावा कंपाइलर.class
द्वारा बनाई गई फ़ाइल है और यह स्रोत कोड में मौजूद नहीं है।
synthetic
कक्षा का उदाहरण उपयोग : अनाम आंतरिक वर्ग
synthetic
वर्ग है और यह java.text.DigitList के अंदर एक अनाम आंतरिक वर्ग हैDigitList$1.java
लेकिन यह एक आंतरिक फ़ाइल हैDigitList.java
इसका उपयोग क्यों किया जाना चाहिए?
यह .class
फाइल बनाने के लिए जावा कंपाइलर लॉजिक के अंदर एक मैकेनिज्म है
मुझे इसे कैसे प्रयोग में लाना है?
नहीं, डेवलपर्स सीधे इसका उपयोग नहीं करते हैं।
जावा कंपाइलर फ़ाइल synthetic
उत्पन्न करने के लिए उपयोग करता .class
है, और फिर जेवीएम .class
प्रोग्राम लॉजिक को निष्पादित करने के लिए फ़ाइल पढ़ता है।
सिंथेटिक निर्माण वर्ग, विधियाँ, क्षेत्र आदि होते हैं जिनके स्रोत कोड में संबंधित निर्माण नहीं होता है। जेवीएम में बदलाव के बिना नए जावा लैंग्वेज फीचर्स को लागू करने के लिए सिंथेटिक कंस्ट्रक्ट जावा कंपाइलर्स को सक्षम करते हैं। हालांकि, सिंथेटिक निर्माण विभिन्न जावा कंपाइलर कार्यान्वयन के बीच भिन्न हो सकते हैं, जिसका अर्थ है कि .class फाइलें अलग-अलग कार्यान्वयन के बीच भी भिन्न हो सकती हैं।