反射 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培训、期待与您交流! ----------------------
浙公网安备 33010602011771号