使用Reflection读取类的Fields时出错

问题描述 投票:1回答:2

我有一个非常奇怪的情况反编译一个类。

该课程有以下三个领域:

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

当我使用FernFlower或JDGui反编译该类时,我可以看到三个字段没有问题,但是当我将包含该类的.jar加载到我的classLoader中时,此类具有“Map”而不是“List”。

我得到一个:

java.lang.reflect.Field

有了这个属性:

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

类型:interface java.util.Map

class: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
]
java reflection decompiling
2个回答
0
投票

你可以试试这个

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

0
投票

@ 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);
   }
}
© www.soinside.com 2019 - 2024. All rights reserved.