JAVA高新技术---反射总结

反射技术:动态的获取指定的类以及动态的调用类中的内容。

应用场景:


抽取共性

获取字节码文件对象的方法:
1、A a  = new A();
class clazz = a.getClass();
要想获取字节码文件中的对象,先获取字节码文件对象,通过类的对象获取字节码文件对象。

重点:一个类被java虚拟机只加载一次,所以虚拟机中只存在一个A.class对象
 例如:
A a1  = new A();
A a2 = new A();
syso(a1.getClass()==a2.getClass());//结果为true

获取字节码对象2:
使用任意数据类的一个静态成员class,所有数据类型都具备的一个属性
int.class;
好处:不必new 对象。坏处:还是需要具体的类


获取字节码对象3:
使用Class类中的forName方法,通过给定类名来获取对应的字节码文件对象。
Class clazz = Class.forName("类名"); 类名=包名+单独类名 (属于字符串)
好处:只要知道类的名字就可以,获取对应的字节码文件对象,反射技术所使用的!

字节码文件对象的使用:注意:任何对象都可以向上转型
Class clazz = Class.for.Name("zhu.A");
Object obj = clazz.newInstance();//创建字节码对象所表示的类的实例

反射技术常见异常:
Object obj = clazz.newInstancw();<==>A a = new A();
被反射的类,通常都会提供空参数的构造函数。否则报InstantiationException异常
如果报IilegalAccessException异常,则表示类中存在该成员但权限不够


重点:
Person p = new Person();
1.加载Person类,并将Person类封装成字节码文件对象
2.通过new创建Person对象。
3.调用构造函数对对象初始化

Class clazz = class.forName("zhu.A");//任意类
1.通过给定的类名称,加载对应的字节码文件,并封装字节码文件对象
Object obj = clazz.newInstancw();
2.通过new创建给定类的实例
3.调用类的构造函数//没有对应的构造函数,则报实例化异常


无空参构造函数,通过指定的构造函数初始化对象:
1.获取字节码文件对象
2.在获取指定的构造函数
3.通过构造函数初始化对象

区分构造函数,通过参数列表
Class clazz = Class.froName("zhu.A");
//获取指定的构造函数对象
  Constructor cons =  clazz.getConstructor(String.class,int.class);
//传递参数类型,因为先有类型才有类,例如:先获取字节码,才能有对象
Object obj= cons.newInstance("zhuxiao",12);
syso(obj);//打印为String...
若在类中定义toString()方法打印为好的表示


演示获取字段:
Class clazz = Class.forName("zhu.A");
//获取字段 通过字段名获取对应的字段
Field field = clazz.getField("fieldName");//获取公共字段
Field field = clazz.getDeclaredField("fieldName2");//获取类中声明的字段

//对字段值进行设置,先获取对象
Object  obj= clazz.newInstance();
field.set(obj,"fieldName2Value");//IilegalAccessException 字段是私有的

//对字段值进行设置,先获取对象
Object  obj= clazz.newInstance();
field.setAccessible(true);//取消对其对象权限的检查,暴力访问
field.set(obj,"fieldName2Value");

注意:getXXX:获取的都是类中公共的成员
      getDeclaredXXX:获取的都是类中已有的成员
在查api时子类找不见对应方法,找其父类


获取反射类中的方法1:
Class clazz = Class.forName("zhu.A");
Object obj = clazz.newInstance();
Method method = clazz.getMethod("methodName",String.class,int.class);//取公共方法
method.invoke(obj,"祝晓",21);

获取反射类中的方法2:
Class clazz = Class.forName("zhu.A");
Object obj = clazz.newInstance();
Method method = clazz.getMethod("methodNamestatic",null);//访问空参静态方法
method.invoke(null,null);


反射的应用:
实现接口完成扩展性,降低耦合性。
接口可以继承接口



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值