2008-09-26 105 views
18

我使用的常量是一個類的枚舉。我需要在常量上調用方法,但不能引入編譯時間依賴性,並且枚舉在運行時並不總是可用(可選安裝的一部分)。所以我想用反思。如何在枚舉類型爲Class時使用Java反射?

這很簡單,但我之前沒有使用過枚舉的反射。

枚舉看起來是這樣的:

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; 
    } 

} 

什麼是調用常量使用反射的方法的例子嗎?

+0

你已經解釋了你的enum類,但是你的問題是什麼?你是否想知道代碼如何通過反射來發現你的類? – qualidafial 2008-09-26 16:29:17

回答

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`一樣嗎?換句話說,使用`clz.getDeclaredMethod()`而不是`sub.getDeclaredMethod`訪問`getDefaultValue`是不可能的? – 2017-07-13 12:20:15