2008-09-26 18 views
18

Sabit bir Sınıf olduğu bir enum kullanıyordum. Sabit üzerinde bir yöntem çağırmak gerekiyordu ama bir derleme zaman bağımlılığı getiremedi ve enum çalışma zamanında her zaman mevcut değildi (isteğe bağlı yükleme kısmı). Bu nedenle yansıma kullanmak istedim.Enum türü bir Sınıf olduğunda Java yansıması nasıl kullanılır?

Bu kolay, ama daha önce enumlarla yansıma kullanmamıştım.

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

} 

sabit kullanarak yansıma yöntemi çağrılırken bir örnek nedir:

enum böyle bir şey görünüyordu?

+0

Enum sınıfınızı açıkladınız, ancak sorunuz nedir? Sınıfınızın yansıması ile kodun nasıl görüneceğini merak ediyor musunuz? – qualidafial

cevap

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

Neden [0] .getClass() 'çağrısına gereksiniminiz var? Bu, tanım olarak "clz" ile aynı değil midir? Başka bir deyişle, 'sub.getDeclaredMethod' yerine' clz.getDeclaredMethod() 'kullanarak getDefaultValue' öğesine erişmek mümkün değil mi? –