[英]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.