我知道可以做以下事情。
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)
但是根据所有评论,我理解传递类不会发送方法中的任何实例特定信息。
我需要一个火炬。
答案 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
类。它比你想的更低。