在某方法中我获得一个对象比如说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

解决方案 »

  1.   

    看得不是很明白,如果已经是一个User 对象了,你为啥不能强转之后调用getUid()?
    你获得是一个User的对象,还是 User这个类的Class的对象?
      

  2.   

    你这里的
    clazz == User.class
    不是你想要的那个实例对象!
      

  3.   

    TO 2楼 clazz 怎么转 User 有代码即给分了。
    TO 3楼 clazz 打印出来cn.com.xxx.User@ABCEFG 不是当前User对象的引用,那是啥?
      

  4.   

    如果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对象上调用此方法
      

  5.   

    Class<?>clazz = ABC.getObject();
    你确定你的这句话能运行成功?
    而不是Object obj = ABC.getObject()?如果你getObject出来的是个Object,你想打印:((User)obj).getUserUid();!!下次请保证你给出的代码是正确
      

  6.   


    //获取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);
    }
      

  7.   

    反射得到的一般都是object对象~~~都是需要自己根据业务需要进行特定的强转的吧
      

  8.   

    看你答应出来的你这个clazz应该已经是User的对象。为啥你的getObject()确返回Class类型呢直接返回Object不好吗。
    那可以这样转换
    [code=java]
    Class<?>clazz = ABC.getObject();
    if(clazz.getClass().isInstance(User.class)){//判断下是否是User的类型
       User user=User.class.cast(clazz);//是的话就直接通过cast强转成User对象
       user.getUid();//接下来你想干嘛干嘛了
    }
    [code=java]
      

  9.   

    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;
    }
    }
      

  10.   

    大家可能都误解LZ了,ABC.getObject();//这个getObject()方法可能是人家自己写的一个方法,返回的类型是Class罢了。但是Class是包含某些 Class 对象的数组,这些对象表示属于此 Class 对象所表示的类的成员的所有公共类和接口(api解释)。所以一般要先实例化后,才能获取反射后你想要的东西。
      

  11.   

    CSDN应该在 发帖用户 点击“结贴”的时候 锁住 该贴 即使是回复也不应该成功 给出提示信息不过这个很难控制 我点“结贴” 但是我又没结贴 又当如何确实很难控制。