java - 使用反射读取类的字段时出错

标签 java reflection decompiling

我有一个非常奇怪的反编译类的案例。

该类具有以下三个字段:

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):我的类(class)

有谁知道这个奇怪案例的原因是什么?

这是我的代码:

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

关于java - 使用反射读取类的字段时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55393144/

相关文章:

xcode - 是否可以查看mac应用程序的来源?

java - 如何对齐 JTextField 中的文本?

java - 交叉同步块(synchronized block)

java - 如何通过反射获取/设置数组元素?

c# - 为什么在 Log4Net 中命名记录器?

.net - Jetbrains dotPeek 是否对我的代码发出警告?

c# - 如何在已编译的 DLL 中编辑硬编码字符串?

java - 将 UUID 作为 blob 转换为正确的字符串 id hibernate

java - 简单的数学 Java 程序,if 语句不起作用

c# - 属性与静态属性