代码改变世界

反射 Constructor和Filed

2012-02-25 22:35  党飞  阅读(208)  评论(0)    收藏  举报

---------------------- android培训java培训、期待与您交流! ----------------------

Constructor类

所有类的构造方法,属于同一个数据类型Constructor。Constructor类可对构造方法进行各种操作:

得到某个类的所有构造方法:

如:

     Constructor[] constructors=Class.forName("java.lang.String").getConstructors();

得到某一个构造方法:

如:

     Constructor constructor=Class.forName("java.lang.String").getConstructor(String.class);

下面我们来看一个Constructor的具体应用:

Constructor con=String.class.getConstructor(StringBuffer.class);

String cc=con.newInstance(new StringBuffer("abc"));

System.out.println(cc);

输出结果应是abc.

注意,在创建cc对象时,传递的参数一定是StringBuffer类型的,应为我们得到的就是有StringBuffer类型参数

的构造函数,如果写成

String cc=con.newInstance(“abc”);

就要报错,参数不匹配。

       Filed类

    类身上的成员变量用Filed来表示。

    毫无疑问,我们有Filed可以得到对象的成员变量,为了演示其作用我们先来定义两个变量

    class Ref{

     private int x;

     public int y;

     public Ref(int x,int y)

    {

        this.x=x;

        this.y=y;

     }

}

    接着我们来取他的值:

    Ref r1=new Ref(1,2);

    Filed filedy=rl.getClass().getFiled("y");

    注意,此时得到filedy是属于class,而不是对象我们要想得到对象r1的y值还需要进行下面一步:

  int a=(int)filedy.get(r1);

    这时得到的才是r1对象中的值。

   但是对私有的x就不能用这种方法了,我们当然有解决方法:

     Filed filedx=r1.getClass().getDeclaredField("x");

     filedx.setAccessible(true);

这样我们就可以取得r1的私有成员,其实我们以上进行的过程被称为暴力反射。

---------------------- android培训java培训、期待与您交流! ----------------------