2014-07-09 1 views
3

특정 종속성을 사용하지 않거나 사용하지 않는 Object의 선언 된 필드를 가져 오는 데 문제가 있습니다.종속 항목이없는 클래스의 Java getDeclaredFields

Field[] fields = OBJECT.getClass().getDeclaredFields(); 

NoClassDefFoundError은 해당 개체가 누락 된 클래스를 가져올 때 throw됩니다.

내가하고 싶은 이유는 Bukkit 플러그인 때문입니다. 종속성이없는 플러그인 인스턴스의 필드를 가져 오려고합니다. 플러그인 인스턴스는 사용되지 않지만 플러그인이 시작할 수 있습니다.

런타임에 플러그인은 필요한 종속성이 있는지 여부와 해당 특정 필드를로드 할 것인지 여부에 따라 검사합니다.

가능한 해결책 :
1) 실종 된 클래스 + 패키지를 실제로 생성하고 ASM을 사용하여 다시 시도하십시오. 그러나 나는 이것을 어떻게하는지 정말로 모른다.

감사합니다,
맥심

+0

이 플러그인을 작성한다고 가정하면 중복 된 가져 오기를 제거하지 않는 이유는 무엇입니까? – JamesB

+0

필드를 가져 오려는 플러그인을 쓰고 있지 않으므로 수정할 수 없습니다. – Maximvdw

+0

bump(); // 답변이있는 사람은 누구입니까? – Maximvdw

답변

0

종속성이없는 동안 왜이 필드를 걱정해야 하는가?

발생하면 클래스는 런타임에 인스턴스를 가져서는 안됩니다. 나는 JRE가 그것의 필드에 대한 클래스가없는 객체의 인스턴스를 생성 할 수 있다고 생각하지 않는다.

getDeclaredMethods를 읽는다면 의미가있을 수 있습니다.

ASM/BCEL은 좋은 방향이지만 실종 클래스는 가상으로 만들지 않습니다 (사용자가 누구인지 모르기 때문에). 그것들을 사용하여 "클래스 파일"을 읽거나 구문 분석하여 서명을 디코딩합니다 (즉, 클래스 로더를 사용하지 않고 getDeclaredFields).

softdepend : 당신의 plugin.yml 파일에 다음 행을 추가하여 당신은 당신의 플러그인 전에로드를 강제로 수 : 모든

+0

로드/가져오고 싶지 않습니다. 로드하려는 플러그인에 참조를 참조하는 필드가 있습니다 (private PluginB pluginb;) 플러그인에서 해당 종속성을로드합니다 (있는 경우). "getDeclaredFields"를 사용할 때 noclassdeffound 오류가 발생합니다. – Maximvdw

0

먼저 대상 플러그인이 플러그인 전에로드되어 있는지 확인 [ Pluginname]

여기서 Pluginname은 반사 대상 플러그인입니다. 둘째, 당신은 당신이 모든 필드를 나열하지,이 플러그인에서 필요 필드를 얻을해야하지만 당신은 사용자 정의 필드 게터 방법은 코드의 컴파일 및 만들기보다, 모든 분야의 좀하고 싶습니다 경우 :

public ArrayList<Field> getFields(Class cl,String... analyze){ 
    ArrayList<Field> fields=new ArrayList<Field>(); 
    for (String f:analyze){ 
     try{ 
      Field field=cl.getDeclaredField(f); 
      field.setAccessible(true); 
      fields.add(field); 
     } catch (Throwable err){ 
     } 
    } 
}