2012-11-18 121 views
0

我想了解反射和获得字段如下:一个类实例化动态

Class<?> inputClass = in.getClass(); 
Field[] classFields = inputClass.getFields(); 

的代码是罚款了这一点。现在我想通过每个字段,打印自己的价值,所以我做的:

for (Field f : classFields) { 
    System.out.println(f.get(new Object()).toString()); 
} 

用适当的try/catch一个IllegalAccessException(省略清晰)。我也尝试过在这里传递一个字符串,这也产生了下面描述的结果。每个f的一个类型,没有对象,String或等于在

这引发异常:

Exception in thread "Thread-0" java.lang.IllegalArgumentException: Can not set java.lang.String field TestClass.testField to java.lang.Object 
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:164) 
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:168) 
at sun.reflect.UnsafeFieldAccessorImpl.ensureObj(UnsafeFieldAccessorImpl.java:55) 
at sun.reflect.UnsafeObjectFieldAccessorImpl.get(UnsafeObjectFieldAccessorImpl.java:36) 
at java.lang.reflect.Field.get(Field.java:372) 
at LearningReflection.messageToText(LearningReflection.java:88) 
at LearningReflection$1.run(LearningReflection.java:180) 

我猜这是因为我已经通过对象的实例(或String,当我用String替换Object时),而不是该类实际包含的Object的特定子类的实例。由于我不知道在编译时会发生什么,因此我需要从字段中提取有关类的类型的信息,并在运行时将其实例化以传递给get()方法。这猜测是否正确,如果是这样,我该如何去做这件事?

+0

请看这个http://stackoverflow.com/questions/364523/is-there-a-general-backend-library-for-java-reflection for Java反射中的几个好的库。 – Uberto

回答

1

主要问题是您试图在Object实例上获取TestClass字段的值。这是一个类型错误。将TestClass的实例传递给get

class TestClass { 
    public Date d = new Date(); 

    public static void main(String[] args) throws Exception { 
    MainClass.printFieldValues(new TestClass()); 
    } 
} 

public class MainClass { 
    public static void printFieldValues(Object in) throws Exception { 
    for (Field f : in.getClass().getFields()) 
     System.out.println(f.getName() + ": " + f.get(in)); 
    } 
} 

请注意,它只访问类/对象的public字段。

+0

但是由于我不知道MyClass在编译时是什么,我该怎么做?什么是Java语法,用于从字段中提取类,并在运行时实例化它? – Froskoy

+0

你有'in'实例,所以传给'get'。 –

+0

所有字段f都有不同的类型,它们*不等于in的类型,所以在这里还没有类型错误? – Froskoy

0
Object o=Class.forName(qualifiedClassName).newInstance(); 

然后你可以将o转换为你的类,然后调用适当的方法。 qualifiedClassName是类名称的字符串表示形式,如“TestClass”