제가 할 노력하고있어 설명하기가 힘들 수 있도록 나는 자바에 아주 새로운 해요.
나는이 같은 여러 객체 상수를 호출하는 추상 클래스를 가지고 :
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
접근 방식은 더 나은 .