有一个类是这样的:
public class TestRef{
public User getUser(){
//......
return new User();
}
class User{
private String userName; public String getUserName(){
return userName;
} public void setUserName(String userName){
this.userName = userName;
}
}
public static void main(String[] args)
{
TestRef test = new TestRef();
test.getUser().setUserName("Tom");
}}现在要通过getuser获取user对象,然后给user的userName 赋值,这个用反射如何做
test.getUser().setUserName("Tom");//如何用反射实现
public class TestRef{
public User getUser(){
//......
return new User();
}
class User{
private String userName; public String getUserName(){
return userName;
} public void setUserName(String userName){
this.userName = userName;
}
}
public static void main(String[] args)
{
TestRef test = new TestRef();
test.getUser().setUserName("Tom");
}}现在要通过getuser获取user对象,然后给user的userName 赋值,这个用反射如何做
test.getUser().setUserName("Tom");//如何用反射实现
解决方案 »
- 新手求助:网络编程套接字之郁闷
- 如何用jtable做个可编辑属性面板
- 火车票查询问题!求方法!!!!!!!!!!!!!!!!!!!!
- 快去找工作(java)了,现在工作的哥哥姐姐们,请说说你们当时找工作的经验。谢谢!散100分。
- 请问java中如何调用载有图片的dll
- (100分帖)哪位大牛知道sun公司网站哪里可以下到com.sun.rowset包所在的jar包及帮助文档?
- 请问得到一个文件的后缀名啊?
- 同志们,我也要回家了,也散分!
- javamail中,正文的汉字在outlook中显示成汉等字样
- 自学head first java 35页习题输入后跑不出来 求高手帮看看
- Vector 还是ArrayList——哪一个更好
- 如何让JTextField失去焦点
2.这种典型问题可以考虑用bean来解决而不是手写反射代码。比如http://commons.apache.org/beanutils/
3.你真的需要反射吗?或许你根本不需要这种动态特性。当然没有你的应用场景别人很难确定了。希望你能确定自己在使用正确的技术解决问题。
1. 先取得Object类型的User对象obj,例如从list里:obj = list.next();
2. 再取得setUserName这个方法: Method method = obj.getClass().getDeclaredMethod("setUserName");
3. 再使用Method的invoke方法设置对象obj的属性值: method.invoke(obj, args);
invoke(Object obj, Object... args)
Object obj=c.newInstance();
这样拿到的obj是TestRef对象,那内部类User怎么拿呐?
此时的User相当于外部类TestRef的一个属性,
那么循环c.getFields()返回的数组可以得到TestRef的属性User;
Field f[] = c.getFields();
Class u = Class.forName(f[i].getType().getName()));
这样应该就能得到user对象了。
Method m = u.getMethod("setUserName",new Class[]{Class.forName("java.lang.String")});
m.invoke(obj,new Object[]{"Tom"});
应该是这样一个思路,你试试吧。
如果改成public内部类,可以试试
Class tfc = Class.forName("TestRef");
Object tf = tfc.newInstance();
Class user_class = Class.forName("TestRef$User");
//Constructor user_c = user_class.getConstructor(new Class[]{tf.getClass()});
//Object user = user_c.newInstance(tf); //反射生成内部类实例
Method m1 = tfc.getDeclaredMethod("getUser");
//m1.setAccessible(true); //public方法不需要这个
Object user = m1.invoke(tf);
Method m2 = user_class.getDeclaredMethod("setUserName", new Class[]{String.class});
m2.invoke(user);
Class tfc = Class.forName("TestRef");
Object tf = tfc.newInstance();
Class user_class = Class.forName("TestRef$User");
//Constructor user_c = user_class.getConstructor(new Class[]{tf.getClass()});
//user_c.setAccessible(true); //对于非public内部类可以这样
//Object user = user_c.newInstance(tf); //反射生成内部类实例
Method m1 = tfc.getDeclaredMethod("getUser");
//m1.setAccessible(true); //public方法不需要这个
Object user = m1.invoke(tf);
Method m2 = user_class.getDeclaredMethod("setUserName", new Class[]{String.class});
m2.invoke(user, new Object[]{"value"});