2010-08-31 12 views
11
interface Foo<T> { ... } 
class Bar implements Foo<Baz> { ... } 

मुझे Bar ऑब्जेक्ट मिला है। इसके लिए T का मान कैसे प्राप्त करें (Baz)?जावा प्रतिबिंब का उपयोग कर प्रकार पैरामीटर मान कैसे प्राप्त करें?

अभी तक, मैं केवल इंटरफ़ेस और T प्राप्त करने में कामयाब रहा, लेकिन मुझे इसका मूल्य प्राप्त करने का कोई तरीका नहीं दिखाई दे रहा है।

अग्रिम धन्यवाद।

उत्तर

20
Type type = bar.getClass().getGenericInterfaces()[0]; 

if (type instanceof ParameterizedType) { 
    Type actualType = ((ParameterizedType) type).getActualTypeArguments()[0]; 
    System.out.println(actualType); 
} 

बेशक, सामान्य मामले में, आप सरणी पर पुनरावृति करना चाहिए, बल्कि यह सोचते हैं की तुलना में यह excatly एक तत्व ([0]) है। उपरोक्त उदाहरण के साथ, आप actualType से java.lang.Class पर जा सकते हैं। अन्य मामलों में यह अलग हो सकता है (मेरिटॉन द्वारा टिप्पणी देखें)

+3

ध्यान दें कि सामान्य रूप में, 'actualType' जरूरी नहीं है एक सादे' java.lang.Class' - यह भी एक 'GenericArrayType', एक' ParametrizedType', या एक 'TypeVariable' हो सकता है। – meriton

+0

सच है। मेरा मतलब था कि उसके मामले में यह 'कक्षा' है। – Bozho

0

यदि आपके पास क्लासपाथ पर पहले से ही गुवा है, तो यह थोड़ा अधिक मजबूत है क्योंकि आप इंडेक्स के बजाय इंटरफ़ेस/सुपरक्लास निर्दिष्ट करते हैं।

TypeToken<?> baz = TypeToken.of(Bar.class).resolveType(Foo.class.getTypeParameters()[0]); 
System.out.println(baz.getRawType()); // class Baz 
संबंधित मुद्दे

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