大话Java中的反射

目录

1、反射简介
2、反射作用
3、反射实现
4、反射操作泛型
5、动态编译

1、反射简介

       指的是可以在运行是加载、探知、使用编译期完全未知的类。反射机制可以在运行时动态的获取任意一个类的属性和方法,并可以对任意一个属性进行赋值,调用任意一个方法。(即便是私有方法,只要设置setAccessible)
2、反射作用

       把java类中的各种结构(方法、属性、构造器、类名)映射成一个个的java对象。利用反射技术可以对一个类进行解刨,反射是框架设计的灵魂。另外,反射是程序运行时需要的,可以利用反射机制、字节码操作获得类似动态语言的特性。
3、反射实现

       Class c=Class.forName(类路径(包括包名和类名))
       这里的Class是java.lang.Class,十分特殊,用来标识java中类型。
        注意:一个类只对应一个反射对象
        获取反射对象的其他方法:
       .class 获取反射对象
       String.class 获取String类的反射对象
        .getClass() 方法获取反射对象
       而在获得反射对象之后,可以进而过得相应反射对象中的属性、方法以及构造器。

	getFields()  只能获得public的field
	getDeclaredFields() 获得所有的属性field
	
	getDeclaredMethods() 获得所有的方法
	getDeclaredMethod(方法名称,参数类型)  根据指定方法名称与方法中的参数类型获得 方法信息
	如果方法有参数,则必须传递参数类型
	如果方法五参数,参数类型为null
	
	getDeclaredConstructors() 获得所有的构造器
	getDeclaredConstructor(类型...)  通过传递构造器中参数的类型来获得制定的构造器
	例:getDeclaredConstructor(int class, int class, int class);

       通过反射创建新的类示例,有两种方式:

	Class.newInstance() //此方法在最近版本的jdk已过时,如jdk1.9
	Constructor.newInstance() 

	Class.newInstance() 抛出所有由被调用构造函数抛出的异常。 
	Class.newInstance() 要求被调用的构造函数是可见的,也即必须是public类型的; 
	Constructor.newInstance() 在特定的情况下,可以调用私有的构造函数。 

       通过反射API动态调用方法:
在这里插入图片描述

       通过反射API操作属性

	User u4 = clazz.newInstance();
	Field f = clazz.getDelcaredField(“uname”);
	f.set(u4,”lf”); // 通过反射直接写属性
	Sytem.out.println(u4.getName());//输出结果一样 通过调用方法直接调用
	Sytem.out.println(f.get(u4));//输出结果一样 通过发射进行调用

       而如果uname是私有属性的话,上面操作就会报错,因为私有属性只有同一类才能访问,而其他类没有权限访问。
解决方法
       通过setAccessible(true) 声明该属性不用做安全检查,私有属性也可直接访问

	User u4 = clazz.newInstance();
	Field f = clazz.getDelcaredField(“uname”);	
	f.setAccessible(true);
	f.set(u4,”lf”);
	Sytem.out.println(u4.getName());//输出结果一样
	Sytem.out.println(f.get(u4));//输出结果一样

setAccessible:

       启用或禁用访问安全检查的开关。true:反射对象在使用时应该取消java语言访问检查。并不是为true就能访问,为false就不能访问。
       禁止安全检查,可以提高反射的运行效率。

4、反射操作泛型

在这里插入图片描述
5、动态编译
在这里插入图片描述
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值