2010-11-16 10 views
20

में जावा प्रतिबिंब एपीआई का उपयोग कर सकते हैं क्या जीडब्ल्यूटी क्लाइंट पक्ष में जावा प्रतिबिंब एपीआई का उपयोग करना संभव है? मैं जवाबीन पर किसी संपत्ति के मूल्य को खोजने के लिए प्रतिबिंबों का उपयोग करना चाहता हूं। क्या यह संभव है?क्या आप जीडब्ल्यूटी क्लाइंट

उत्तर

12

को लागू करने का एक उदाहरण मिल सकता है मैं वहाँ गया है और समाधान वास्तव में बाध्यकारी और जेनरेटर स्थगित प्रयोग है। आप जनरेटर के उपयोग को देखने के GWT ग्राहक यहाँ में प्रतिबिंब की कमी दूर करने के लिए कर सकते हैं:

http://jpereira.eu/2011/01/30/wheres-my-java-reflection/

आशा है कि यह मदद करता है।

10

चूंकि जीडब्ल्यूटी कोड का अनुवाद जावास्क्रिप्ट में किया गया है प्रतिबिंब एपीआई का प्रत्यक्ष उपयोग समर्थित नहीं है।

एक छोटी परियोजना GWT-Reflection है, जो जीडब्ल्यूटी में प्रतिबिंब का उपयोग करने की अनुमति देती है।

+2

दिलचस्प परियोजना। नोट: इसका उपयोग करने से पहले, सुनिश्चित करें कि आप जीपीएल लाइसेंस स्वीकार कर सकते हैं। –

+0

लाइसेंस के कारण नोप इसका उपयोग नहीं कर सकता है। वैसे भी सूचक के लिए धन्यवाद –

+0

नीचे मेरी टिप्पणियां नोट करें ... मैंने प्रतिबिंब एपीआई के अपाचे लाइसेंस प्राप्त पूर्ण कार्यान्वयन को जारी किया है: https://github.com/WeTheInternet/xapi/tree/master/gwt/gwt-reflect – Ajax

12

आप जीडब्ल्यूटी जेनरेटर कार्यक्षमता का उपयोग कर सकते हैं जो आपको जीडब्ल्यूटी संकलन चरण के दौरान कोड उत्पन्न करने की अनुमति देता है।

आपका सेम, कि आप आत्मनिरीक्षण करना चाहते हैं,

public Object getProperty(String propertyName){} 

के इस वर्ग के IntrospectionBean कहते हैं एक वर्ग एक विधि

रूप में परिभाषित किया गया है कि विस्तार कर सकते हैं।

मान लीजिए कि आप तो अपने सेम को परिभाषित किया है कि के रूप में करते हैं:

public class MyBean extends IntrospectionBean { 
    private String prop1; 
    private String prop2; 
} 

GWT जनरेटर MyBean के सभी क्षेत्रों के लिए उपयोग होगा और यह getProperty(String propertyName) विधि उत्पन्न कर सकते हैं के दौरान GWT समय संकलन, सभी क्षेत्रों के माध्यम से दोहराने के बाद MyBean का।

उत्पन्न वर्ग इस प्रकार दिखाई देंगे:

public class MyBean extends IntrospectionBean { 
    private String prop1; 
    private String prop2; 

    public Object getProperty(String propertyName) { 
     if ("propr1".equals(propertyName)) { 
      return prop1; 
     } 
     if ("propr2".equals(propertyName)) { 
      return prop2; 
     } 

     return null; 
    } 
} 

आप बस तो आदेश में एक संपत्ति यह कार्यावधि में नाम के आधार पर पुन: प्राप्त करने में myBean.getProperty("prop1") इस्तेमाल कर सकते हैं।

Here आप कैसे एक gwt जनरेटर

+0

धन्यवाद उसके लिए। वास्तव में मुझे –

0

यदि आप सिर्फ एक निजी क्षेत्र को पकड़ने के लिए प्रतिबिंब का उपयोग करना चाहते हैं, तो इसके बजाय jsni (जावास्क्रिप्ट मूल इंटरफ़ेस) का उपयोग करने पर विचार करें; यह निजी या सार्वजनिक का बोध भी नहीं है, तो आपको वह सभी कुछ तो की तरह चाहते हैं हड़पने कर सकते हैं:

package com.foo; 

class SomeClass { 
    private String someField; 
    private static int someInt; 
} 

//accessors: 
native String ripField(SomeClass from) 
/*-{ 
    return [email protected]::someField; 
}-*/; 
native int ripInt() 
/*-{ 
    return @com.foo.SomeClass::someInt; 
}-*/; 

इसके अलावा, मैं java.lang.ClassnewInstance/प्रतिबिंब के लिए अनुकरण अप परिष्करण के बीच में हूँ।

यदि आप इसके साथ खेलना चाहते हैं तो मैं यहां लगभग दो दिनों में एक लिंक के साथ पोस्ट करूंगा।

यह आवश्यक है कि आप एक तरीका है जिसके एक कस्टम जनरेटर (GWT.create की तरह करने के लिए मैं मार्ग, को छोड़कर यह क्षेत्र और विधि accessors कि सिर्फ तरीकों/क्षेत्रों jsni की ओर इंगित उत्पन्न java.lang.Class रिटर्न के माध्यम से एक वर्ग गुजरती हैं। :)

+0

की आवश्यकता थी, जब मैंने पहली बार यह जवाब देखा, तो मुझे उत्साहित हो गया, लेकिन आगे निरीक्षण पर इसकी गंभीर कमीएं हैं, जैसे कि कक्षा के प्रकार को पहले से जानना (जेनिक्स में उपयोग नहीं कर सकता) और एक 'चीर' विधि होनी चाहिए प्रति फ़ील्ड, फ़ील्ड नाम की आपूर्ति करने के बजाय। शायद एक सामान्य जावबीन गेटटर भी हो सकता है। – NickJ

+0

... जब तक कि आप उस कोड को नियंत्रित नहीं करते हैं जिसे आपको एक्सेस करने की आवश्यकता है, और निजी सदस्यों तक पहुंच प्राप्त करने के लिए किसी और के कोड की प्रतियों को बनाए रखना नहीं होगा। इसके अलावा, जेनिक्स प्रतिबिंब के साथ कैसे मदद करेगा? जेनेरिक मिरर के माध्यम से काम करते हैं, और जेएसएनई मैचों से मेल खाता है। – Ajax

+0

बस एक और विचार, आप यह सब उत्पन्न कर सकते हैं। मैं जीडब्ल्यूटी का एक सार्वजनिक निर्माण बनाए रखता हूं, net.wetheinter: gwt - *: 2.7.0 जिसमें जादू विधि इंजेक्शन के माध्यम से प्रतिबिंब लागू किया गया है। यह ग्वाट का एक कांटा है क्योंकि मुझे ऊपर दिए गए उदाहरण की तरह जेनरेट कोड के साथ कक्षा/स्ट्रिंग अक्षर के माध्यम से किए गए प्रतिबिंब को खोजने और बदलने के लिए GWT.create के लिए तंत्र को अपहरण करना पड़ा। वहां एक ऐसा संस्करण होता था जो आपको कंपाइलर में हैक करने से बचने के लिए GWT.create के साथ कक्षा को बढ़ाने देता है, लेकिन इसे बनाए रखने के लिए पर्याप्त रुचि नहीं थी (यह भी कोड का बहुत उत्पन्न हुआ)। – Ajax

1

मैंने अपनी जीटीटी-प्रतिबिंब पुस्तकालय सार्वजनिक बना दिया है।

https://github.com/WeTheInternet/xapi/tree/master/gwt/gwt-reflect https://github.com/WeTheInternet/gwt-sandbox/tree/xapi-gwt/user/src/com/google/gwt/reflect

Gwt अपने स्वयं के ऊपर Class.java की मेरी संस्करण लेने बनाने की कोशिश कर के साथ classpath मुद्दों के कारण, मैं अंत में बस काँटेदार Gwt, जावा 8 और प्रतिबिंब समर्थन जोड़ा है, और अब शुद्ध बनाए रखने के .wetheinter: gwt - *: 2.7.0 जो इस समर्थन में (मैं एक 2.8 कुछ समय जारी करेंगे Gwt 2.8 सीधा प्रसारण होता है के बाद)

यह प्रतिबिंब के तीन स्तर का समर्थन करता है पके हुए हैं:

अखंड:

// Embeds all data needed to perform reflection into hidden fields of class 
GwtReflect.magicClass(SomeClass.class); 
SomeClass.getField(fieldName).set(null, 1); 

लाइटवेट:

// Allows direct reflection, provided ALL parameters are literals, or traced to literals 
SomeClass.class.getField("FIELD_NAME").set(null, 1); 

फ्लायवेट:

// Skips creating a Field object entirely, and just invokes the accessor you want 
// All params must be literals here as well 
GwtReflect.set(SomeClass.class, "FIELD_NAME", null, 1); 

ये उदाहरण भी तरीके और कंस्ट्रक्टर्स के लिए काम करते हैं। एनोटेशन के लिए बुनियादी समर्थन है, और भविष्य में आने के लिए और भी बहुत कुछ है।

संबंधित मुद्दे