黑马程序员--Java学习日记5_反射

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

在JAVA中,框架一般都会用到反射。学习反射,必须学习Class 类,这里的Class 中c 是大写的。java的类用于描述某一类事物,该类事物具体有什么属性,有什么功能。至于这个属性值具体是什么,则是由这个类的实例对象来确定的,不同的实例对象有不同的属性值。一般来讲,我们定义一个类 Person ,那么 Person 的对象我们可以通过new 直接创建,如: Person p1=new Person()。而Class 类不能直接new 来创建对象的,它的对象代表的是内存里面的一份字节码,因此只能这样创建:Class c1=Person.class。

获取各个字节码对应的实例对象有三种方法:
(1) 类名.class ,例如 System.class;
(2) 对象.getclass(),例如 new Person().getclass();
(3) Class.forName(“类名”);例如,Class.forName(“java.util.Date”);
反射的时候,主要用第三种方法。

反射就是把java类中的各种成分映射成相应的java类。


Method类可以得到每个类的方法。
String str1 = "abc";
Method methodCharAt = String.class.getMethod("charAt", int.class);
System.out.println(methodCharAt.invoke(str1, 2)); //得到c

如果传递给Method对象的invoke()方法的第一个参数为null,这说明该Method对象对应的是一个静态方法。


获取某个类的所有构造方法:
Constructor constructors[]=Class.forName(“java.lang.String”).getConstructors();//Constructor代表某个类中的一个构造方法。
获取某个构造方法:
Constructor constructor=Class.forName(“java.lang.String”).getConstructor(StringBuffer.class); 在获得方法的时候要用到类型。


实例对象的创建:

普通方式:String str=new String(new StringBuffer(“abc”));
反射方式:String str=(String)constructor.newInstance(new StringBuffer(“abc”)); 


Field 类代表某个类中的一个成员变量。

比如定义一个Reflect  类
public class Reflect {
private int x;
public int y;
public Reflect(int x, int y) {
this.x = x;
this.y = y;
}
通过ReflectPoint pt1 = new Reflect(2,4);

Field fieldY = pt1.getClass().getField("y"); y的值为4。


但是需要记住fieldY不是对象身上的变量,而是类上,要用它去取某个对象上对应的值。

Field fieldX = pt1.getClass().getField("x");是错误的,取不到X的值,因为x是private的,getField方法无法访问私有变量的,需要使用getDeclaredField方法。
最重要的一点,输出得到的值时候,System.out.println(fieldY.get(pt1));这可以直接打印输出Y的值为4,但是System.out.println(fieldX.get(pt1));却不能直接输出X,需要加上一行代码fieldX.setAccessible(true);之后才能显示,这称之为 暴力反射。

---------------------- android培训        java培训        期待与您交流!----------------------
详细请查看:http://edu.csdn.net/heima

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值