簡體   English   中英

使用反射讀取類的字段時出錯

[英]Error reading the Fields of a class using Reflection

我有一個很奇怪的情況,反編譯一個類。

該類具有以下三個字段:

private String descError;
private Number codError;
private List<String> errorList;

當我用FernFlower或JDGui反編譯該類時,我可以看到三個字段,但是當我將包含該類的.jar加載到我的classLoader中時,該類具有“地圖”而不是“列表”。

我得到一個:

java.lang.reflect.Field

具有此屬性:

簽名: Ljava/util/Map<Ljava/lang/Object;Ljava/lang/Object;>;

類型: interface java.util.Map

類:Myclass

有人知道這起奇怪案件的起因嗎?

這是我的代碼:

private List<MyObjects> loadClass(String clazz, URLClassLoader completeClassLoader) {
    Class<?> loadClass = completeClassLoader.loadClass(clazz);
    Field[] classFields = loadClass.getDeclaredFields();
    for(Field fAux : classFields) {
        //My code
    }
}

loadClass.getDeclaredFields返回以下類型的數組:

[
private java.lang.String MyClass.fieldName1, 
private java.lang.Number MyClass.fieldName2, 
private java.util.Map MyClass.fieldName3
]

代替實際類型:

[
private java.lang.String MyClass.fieldName1, 
private java.lang.Number MyClass.fieldName2, 
private java.util.List MyClass.fieldName3
]

你可以試試這個

public static void run(String[] args) throws ClassNotFoundException {
    Class clazz = Class.forName("com.testing.reflection.MyClass");// this is where you would specify which class you want, use your own method to plugin the string, it needs to be the full package along with the class name
    Field[] fields = clazz.getDeclaredFields();
    for (Field field : fields) {
        String modifierType = Modifier.toString(field.getModifiers()) + " ";//this will return the modifier each field has in the class
        String fieldType = field.getType().getSimpleName() + " ";// this will return the data type of each field in the class
        System.out.println(modifierType + fieldType + field.getName() + "\n");// field.getName() will return the name of each field in the class
    }
}

它非常基礎,您可以以自己的方式實現它,但是它可以正常工作,這是我運行它時的結果

private String descError

private Number codError

private List errorList

@ christiaan的答案還可以。 但是我稍微修改了您的方法,我得到了正確的類型:

private java.lang.String TestClass.descErrorprivate 
java.lang.Number TestClass.codErrorprivate 
java.util.List TestClass.errorList

private void loadClass(final String clazz) throws ClassNotFoundException {
   final Class<?> loadClass = ClassLoader.getSystemClassLoader().loadClass(clazz);
   final Field[] classFields = loadClass.getDeclaredFields();
   for (final Field fAux : classFields) {
      System.out.printf("%s", fAux);
   }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM