从Class对象java中检索实例

时间:2014-01-14 19:16:10

标签: java generics

我知道可以做以下事情。

User user = new User();
user.setUsername("a");
user.setPassword("abc");

 Class c = user.getClass();

但是我遇到的情况是我必须从变量“c”中提取实例信息

甚至可能吗? 。我们确实有一个c.newInstance()方法,但是会创建一个User对象的新实例。我需要访问User的现有实例,该实例负责首先创建“c”变量。

由于

----------- ----------- EDIT 看看评论我明白了我的getClass概念是有缺陷的。我想要实现的是我需要一个迭代对象的getter的方法。那么这样的签名会是什么?

我正在思考

public static <T> List<NameValuePair> entityConvert1(Class<T> entity)

但是根据所有评论,我理解传递类不会发送方法中的任何实例特定信息。

我需要一个火炬。

2 个答案:

答案 0 :(得分:4)

<强>更新

看起来,你只想从你的类中获取getter方法,然后调用它来获取特定实例的值。

您可以使用Introspector获取所有获取者。编写一个通用方法,采用2个参数 - Class<T>T类型:

public static <T> void executeGetters(Class<T> clazz, T instance) throws Exception {
    BeanInfo beanInfo = Introspector.getBeanInfo(clazz);

    for(PropertyDescriptor propertyDescriptor: beanInfo.getPropertyDescriptors()){
        // Get Method instance used for reading this property
        Method method = propertyDescriptor.getReadMethod();
        // Invoke this method on 'instance'. 
        System.out.println(method.invoke(instance));
    }
}

现在,将此方法调用为:

executeGetters(User.class, user);

这将打印user实例的所有属性的值。请注意,如果User类缺少getter方法,则此Method实例将为null,您可能会获得NPE。你需要检查一下。

答案 1 :(得分:2)

  

我需要访问User的现有实例,该实例负责首先创建“c”变量

无法完成,因为getClass()方法的结果与c之间没有任何关联。问题是Class c表示c类型的实例,而不是user的特定实例。 Class本身是JVM加载的字节码文件及其公开内容的表示,因此您可以执行反射操作。它甚至不直接类似于字节码所代表的实际User类。它比你想的更低。