有一个类是这样的:
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");//如何用反射实现

解决方案 »

  1.   

    1.你有没有学过任何一丁点关于反射的知识?如果没学过就先学点。
    2.这种典型问题可以考虑用bean来解决而不是手写反射代码。比如http://commons.apache.org/beanutils/
    3.你真的需要反射吗?或许你根本不需要这种动态特性。当然没有你的应用场景别人很难确定了。希望你能确定自己在使用正确的技术解决问题。
      

  2.   

    例如setUserName()
    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) 
      

  3.   

    beanutils 我看过,beanutils并不适用我当前的场景,可能我举的例子简化了我需要达到的效果。
      

  4.   

    Class c=Class.forName("TestRef"); 
    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"}); 
    应该是这样一个思路,你试试吧。
      

  5.   

    beanUtils是实体bean 属性互copy的,你可以看他源码挑自己有用的吗?它肯定也是通过反射实例化class,然后再取的class中的setter方法去赋值的啊
      

  6.   

    LZ试想问内部类的反射吧,估计要把class User改成public class User才行,否则TestRef.class.getClasses()应该就拿不到User类
    如果改成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);
      

  7.   

    好像非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()});
    //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"});