论坛首页 入门讨论版 Java

如何用反射获得类的某一Field的默认值?在未构造对象的时候

浏览 199 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
最后更新时间:2008-05-31
比如定义如下class

public class ClassA{
    private int field0=100;
}


ClassA应该保存了field0的默认值100,但是无论Class或者Field类的API都未提供如何拿到这个默认值的方法。有知情人望告知一下,谢谢
   
最后更新时间:2008-06-01
为这个变量写一个SET方法通过方法反射进行赋值

    public Object setFileMethodInvoke(Object obj,String fieldName,Object value) throws Exception{   
       
        //获得对象的类型   
        Class classType=obj.getClass();   
//        System.out.println("该对象的类型是:"+classType.toString());   
           
        //通过默认构造方法去创建一个新的对象,getConstructor的视其参数决定调用哪个构造方法   
//        Object objectCopy=classType.getConstructor(new Class[]{}).newInstance(new Object[]{});   
           
        //获得对象的所有属性   
//        Field[] fields=classType.getDeclaredFields();   
           
       
            Field field=classType.getDeclaredField(fieldName);  
            String stringLetter=fieldName.substring(0, 1).toUpperCase();   
               
            //获得相应属性的getXXX和setXXX方法名称   
//            String getName="get"+stringLetter+fieldName.substring(1);   
            String setName="set"+stringLetter+fieldName.substring(1);   
            System.out.println("aaaaaaa::::"+setName+"::"+value);
            //获取相应的方法   
//            Method getMethod=classType.getMethod(getName, new Class[]{});   
            Method setMethod=classType.getMethod(setName, new Class[]{field.getType()});   
            System.out.println("aaaaaaa::::"+setMethod+":::"+value);
            //调用源对象的getXXX()方法   
//            Object value=getMethod.invoke(obj, new Object[]{});   
//            System.out.println(fieldName+" :"+value);   
               
            //调用拷贝对象的setXXX()方法   
            setMethod.invoke(obj,new Object[]{value});    
               
               
           
           
        return obj;   
           
    }
   
0 请登录后投票
最后更新时间:2008-06-01
…………
可能我没说清楚,我的意思是,当类未实例化的时候……
也就是比方说,我拿到ClassA.class这个Class对象时如何获取初值
当然,ClassA.class.newInstance().getDeclaredMethod("someString").invoke()的确可以……

总而言之多谢了,一个下午都没找到Class类里面类似功能的API,包括Javassist里的CtClass类,所以……一会直接考虑这样做算了
   
0 请登录后投票
最后更新时间:2008-06-02
Class a=ClassA.class;
Object o=a.newInstance(); //不这样如何获得初值
Field f=a.getDeclaredField("field0");
f.setAccessible(true);
System.out.print(f.get(o));
   
0 请登录后投票
最后更新时间:2008-06-03
maybe723 写道
Class a=ClassA.class;
Object o=a.newInstance(); //不这样如何获得初值
Field f=a.getDeclaredField("field0");
f.setAccessible(true);
System.out.print(f.get(o));


关键是调用 newInstance,本身也是 class.getConstructor().invoke()出来的玩意,那么构造函数尤其是比如默认构造函数如何知道这些值的初值??显然应该在类文件里面保存一个常量池,保存了这些值才对
不过我是这么认为,但是Class类没有提供API拿到这些常量,我的意思也就是如何拿到这个常量值里面的常量映射关系和值
   
0 请登录后投票
论坛首页 入门讨论版 Java

跳转论坛:
JavaEye推荐