在某方法中我获得一个对象比如说USER用户对象,属性有uid以及get set方法。
Class<?>clazz = ABC.getObject();
System.out.println(clazz);//打印是 cn.com.xxx.User@ABCDEF
//看到这里我已经知道clazz类型是cn.com.xxx.User了。
//但是我目前不能用clazz.getUid()获取到用户对象的编号。
//请问反射里有什么办法可以将class这个对象转化成User对象呢?
//如果可以那我就可以用USER对象.getUid()这个方法获取这个对象的用户编号了。
java?朱超?宁波?反射?j2ee
反射得到的一般都是object对象~~~都是需要自己根据业务需要进行特定的强转的吧Class<?>clazz = ABC.getObject();你确定你的这句话能运行成功?
而不是Object obj = ABC.getObject()?
如果你getObject出来的是个Object,你想打印:((User)obj).getUserUid();!!
下次请保证你给出的代码是正确你这里的
clazz == User.class
不是你想要的那个实例对象!如果User user已经有了。那么可以这么获得uid的值
//使用字段方式的暴力反射,就算没有get方法一样能获取
Field field=User.class.getDeclaredField("uid");
field.setAccessible(true);//强制可访问
Object value=field.get(user);//在user对象上获得此属性的值
//使用它的get方法来获得值
Method method=User.class.getMethod("getUid");
Object value=method.invoke(user);//在user对象上调用此方法
看得不是很明白,如果已经是一个User 对象了,你为啥不能强转之后调用getUid()?
//获取User的字段
Field[] fields = user.getClass().getDeclaredFields();
for(int i=0; i<fields.length; i++){
//获取字段名
String fieldName = fields[i].getName();
//获取类型
Class<?> parameterType = field.getType();
//构建方法名
String getMethodName = "get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);
String setMethodName = "set" + fieldName.substring(0,1).toUpperCase() + fieldName.substring(1);
//获取方法
Method getMethod = user.getClass().getMethod(getMethodName);
Method setMethod = user.getClass().getMethod(setMethodName,parameterType);
}
你获得是一个User的对象,还是 User这个类的Class的对象?
public class Test {
public static void main(String[] args) throws Exception{
Class clazz = User.class;
//无参构造方法
User u = (User)clazz.newInstance();
System.out.println(u.getUid());
//传参构造方法
Constructor con = clazz.getConstructor(String.class);
User u1 = (User)con.newInstance("abcd");
System.out.println(u1.getUid());
}
}
class User{
private String uid;
public User(){}
public User(String uid){
this.uid = uid;
}
public String getUid() {
return uid;
}
public void setUid(String uid) {
this.uid = uid;
}
}