2008-09-26 7 views
18

मैं एक enum का उपयोग कर रहा था जिसमें निरंतर कक्षा थी। मुझे निरंतर एक विधि का आह्वान करने की आवश्यकता थी, लेकिन संकलन समय निर्भरता लागू नहीं कर सका और enum हमेशा रनटाइम (वैकल्पिक इंस्टॉल का हिस्सा) पर उपलब्ध नहीं था। इसलिए, मैं प्रतिबिंब का उपयोग करना चाहता था।एनम प्रकार कक्षा होने पर जावा प्रतिबिंब का उपयोग कैसे करें?

यह आसान है, लेकिन मैंने पहले enums के साथ प्रतिबिंब का उपयोग नहीं किया था।

public enum PropertyEnum { 

    SYSTEM_PROPERTY_ONE("property.one.name", "property.one.value"), 

    SYSTEM_PROPERTY_TWO("property.two.name", "property.two.value"); 

    private String name; 

    private String defaultValue; 

    PropertyEnum(String name) { 
    this.name = name; 
    } 

    PropertyEnum(String name, String value) { 
    this.name = name; 
    this.defaultValue = value; 
    } 

    public String getName() { 
    return name; 
    } 

    public String getValue() { 
    return System.getProperty(name); 
    } 

    public String getDefaultValue() { 
    return defaultValue; 
    } 

} 

लगातार प्रतिबिंब का उपयोग करने की एक विधि लागू की एक उदाहरण क्या है:

enum कुछ इस तरह देखा?

+0

आपने अपनी enum क्लास को समझाया है, लेकिन आपका प्रश्न क्या है? क्या आप सोच रहे हैं कि प्रतिबिंब द्वारा आपकी कक्षा को खोजने के लिए कोड कैसा दिखता है? – qualidafial

उत्तर

38
import java.lang.reflect.Method; 

class EnumReflection 
{ 

    public static void main(String[] args) 
    throws Exception 
    { 
    Class<?> clz = Class.forName("test.PropertyEnum"); 
    /* Use method added in Java 1.5. */ 
    Object[] consts = clz.getEnumConstants(); 
    /* Enum constants are in order of declaration. */ 
    Class<?> sub = consts[0].getClass(); 
    Method mth = sub.getDeclaredMethod("getDefaultValue"); 
    String val = (String) mth.invoke(consts[0]); 
    /* Prove it worked. */ 
    System.out.println("getDefaultValue " + 
     val.equals(PropertyEnum.SYSTEM_PROPERTY_ONE.getDefaultValue())); 
    } 

} 
+0

आपको 'consts [0] .getClass() 'कॉल की आवश्यकता क्यों है? परिभाषा के अनुसार यह 'clz' जैसा नहीं है? दूसरे शब्दों में, 'sub.getDeclaredMethod' के बजाय' clz.getDeclaredMethod() 'का उपयोग करके' getDefaultValue' तक पहुंच बनाना संभव नहीं है? –