변수를 사용하여 호출 자바 객체 상수

icecub :

제가 할 노력하고있어 설명하기가 힘들 수 있도록 나는 자바에 아주 새로운 해요.

나는이 같은 여러 객체 상수를 호출하는 추상 클래스를 가지고 :

public abstract class Enchantment implements Keyed {
    /**
     * Provides protection against environmental damage
     */
    public static final Enchantment PROTECTION_ENVIRONMENTAL = new EnchantmentWrapper("protection");

다른 파일에서 나는이 완벽하게 정상적으로 액세스 할 수 있습니다
Enchantment value = Enchantment.PROTECTION_ENVIRONMENTAL;

그러나,이 대신에 문자열 변수를 사용할 것을 시도하고있다. 이 같은:

String str = "PROTECTION_ENVIRONMENTAL";
Enchantment value = Enchantment.str;

물론이 작동하지 않습니다. 나는 연구의 무리를하고 배운 그래서 나는 이것에 대한 반사를 사용해야합니다. 이 소스 코드의 문서를 사용하여 나는 필드 데이터를 찾고 있었다 생각. 그래서 둘 다 시도 :

Field fld = Enchantment.class.getField("PROTECTION_ENVIRONMENTAL");
Field fld = Enchantment.class.getDeclaredField("PROTECTION_ENVIRONMENTAL");

그러나이 나에게 NoSuchFieldException를 반환했습니다. 내가 그것을했다, 나는 모두를 시도했습니다 getMethod()getDeclaredMethod()행운으로 단지뿐만 아니라 동등하게.

나는이 아마 "개체 상수"이라는 점에서 지금이야? 나는 그들에게 전화하는 방법을 모르겠어요. 하지만 지금은 일이 활용하는 방법에 대한 손실에 확실히 그리고 난 자신을 시도했습니다 모든 후, 나는 여기에 몇 가지 도움을 요청 시간이었다 생각.

엘리엇의 신선한 :

당신이이 있으면 Field, 당신은 호출해야합니다 Field.get(Object)(이 케이스에 인스턴스 class). 뭔가 같은

Class<?> cls = Enchantment.class;
try {
    Field f = cls.getField("PROTECTION_ENVIRONMENTAL");
    System.out.println(f.get(cls));
} catch (Exception e) {
    e.printStackTrace();
}

당신을 원하기 때문에 Enchantment, 당신은 할 수 당신이 얻을 인스턴스에 할당하는지 테스트 Enchantment. 뭔가 같은

Class<? extends Enchantment> cls = Enchantment.class;
try {
    Field f = cls.getField("PROTECTION_ENVIRONMENTAL");
    Object obj = f.get(cls);
    if (cls.isAssignableFrom(obj.getClass())) {
        Enchantment e = cls.cast(obj);
        System.out.println(e);
    }
} catch (Exception e) {
    e.printStackTrace();
}

그러나 enum접근 방식은 더 나은 .

추천

출처http://43.154.161.224:23101/article/api/json?id=315153&siteId=1