Java运行时——反射

Java运行时——反射


反射的基本概念

 

什么是反射?

反射就是通过字节码把Java类中的各个成分映射成相应的反射相关的类。具体的说就是把Java类的包名、字段名、方法名、构造方法名映射成Package类、Field类、Method类、Constructor类。

 

构造方法的反射的应用

 

Constructor类:

Constructor类的对象代表某个类中的一个构造方法。

 

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

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

 

得到某一个构造方法:

例子: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"));

 

Class.newInstance()方法:

例子:String obj = (String)Class.forName("java.lang.String").newInstance();

该方法内部先得到默认的构造方法,然后用该构造方法创建实例对象。

该方法内部的具体代码是怎样写的呢?用到了缓存机制来保存默认构造方法的实例对象。

 

成员变量的反射

 

Field类:

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

Class类的getField()对象方法可以访问可见的成员变量,getDeclaredField()对象方法可以访问私有的成员变量,并使用Field类的setAccessible()对象方法将此字段设置为可访问的。这也叫暴力反射。Field类的get()对象方法获得某个对象的字段值。


方法的反射

 

Method类:

Method类表示某个类的方法。Method类的对象代表某个类中的一个方法。

使用Class类的getMethod()对象方法,获取一个成员方法,通过Method类的invoke对象方法调用method对象对应的方法。

 

得到类中的某一个方法:

例子:Method charAt = Class.forName("java.lang.String").getMethod("charAt", int.class);

 

调用方法:

通常方式:System.out.println(str.charAt(1));

反射方式: System.out.println(charAt.invoke(str, 1)); 

如果传递给Method对象的invoke()方法的第一个参数为null,这有着什么样的意义呢?说明该Method对象对应的是一个静态方法!


反射的作用——>实现框架功能

 

框架与工具类的区别:

我做房子卖给用户住,由用户自己安装门窗和空调,我做的房子就是框架,用户需要使用我的框架,把门窗插入进我提供的框架中。框架与工具类有区别,工具类被用户的类调用,而框架则是调用用户提供的类。

 

框架要解决的核心问题:

我在写框架(房子)时,你这个用户可能还在上小学,还不会写程序呢?我写的框架程序怎样能调用到你以后写的类(门窗)呢?

因为在写才程序时无法知道要被调用的类名,所以,在程序中无法直接new 某个类的实例对象了,而要用反射方式来做。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值