java反射入门备忘

Class类--java类的抽象,是一个特殊的类.

当初理解为每个用class定义的java类,不管是系统定义还是自定义的类,都是Class的实例;现在自我纠正,Class类的实例是各个类在内存中的字节码,张老师讲每个类的字节码是不同的,所以每个类的字节码在内存里存储的内容也是不同的,这些不同的内存空间对应的对象就是Class类的实例(有点像是指向java类的字节码的指针啊).

  

得到Class对象

三种方法得到Class对象:

1。直接指定字节码对象 Class cls = x.class;

2。通过类的对象调用getClass()方法获得

3. 通过Class.forname(String str)方法指定

 

Constructor类是对java类的构造方法的抽象,通过反射构造类的实例,

Constructor constr = new String().getClass().getConstructor(x.class...); //x.class是对应构造方法的参数所属的Class对象,可变参数

String str = constr.newInstance(x...);  //x是构造方法的参数,不是Class对象,但必须是x.class的一个实例对象,可变参数

用new String().getClass().newInstance()调用无参数的构造方法

 

 

Field是对java类的的成员变量的抽象,每个Field对象都是类的属性.

String heima = new String("heima");

Field field = heima.getClass().getField(x);//x是属性名,类型为String

field.get(heima);//heima是所要获得值的属性的所属对象

//field和指向类变量的指针很相似

对私有变量的获取,getField()只能获取可见的变量,对于私有变量则不能获取

Field field = new Object().getClass().getDeclaredField(x);//x是属性名,类型为String;获得指定的类的已声明属性

只是获取field对象还不能取出对应的属性的值

field.setAccessible(true);//设置为可访问,则field所对应的属性不再受private限制(很拽的方法)

field.get(obj);

 

 

Method是java类的方法的抽象,每个Method对象都是类的一个方法

Method method = new String().getClass().getMethod(String strName,x.class...);//获取类的指定的方法,getMethod()的参数strName是方法名,String类型,x.class是方法的参数类型,是Class对象,可变参数

method.invoke(obj,x);//调用方法,obj是调用方法的对象,若为静态方法,可为null;x是x.class的实例对象,即方法的参数

和变量一样,当要调用类的私有方法时,采用同样的方式也可

自定义一个类TestPoint

public class TestPoint {
 
 public String name;
 
 public TestPoint(String name) {
  super();
  this.name = name;
 }


 private void toString()
 {
  System.out.println(name);
 }
 
}

通过反射调用toString()方法

TestPoint tp = new TestPoint("这是私有方法调用");
  Method tpMethod = tp.getClass().getDeclaredMethod("toString");//因为是无参数的方法,只有一个方法名的参数
  tpMethod.setAccessible(true);
  tpMethod.invoke(tp);//这里也只有一个参数

 

反射的基础就是Class类,只有先获得了Class对象才可以进行反射的相关操作.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值