Java反射机制
在运行状态中,对于任意一个类,都能够获取到这个类的所有属性和方法,对于任意 一个对象,都能够调用它的任意一个方法和属性(包括私有的方法和属性),这种动态 获取的信息以及动态调用对象的方法的功能就称为java语言的反射机制。通俗点讲, 通过反射,该类对我们来说是完全透明的,想要获取任何东西都可以。
我们先创建一个类Person, 把类加载进Class里面,
?:问号代表可能的一切。
getClassLoader();返回该类的类加载器.
forName(String className): 返回与带有给定字符串名的类或接口相关联的 Class 对象。
Class3:直接通过类名拿到它的Class,
Class4: 通过实例,如果你拿到一个类的对象,想拿这个类的类信息getClass就能拿到它的信息了。已知对象可以通过这种拿。
接下来我们通过反射机制获取构造器。
GetConstructors:只能拿到能够访问到的构造器,私有的拿不到,就是能拿正常的,非正常的构造器 拿不到 。
如果想拿全部的话要用getDeclaredConstructors这个方法;
一个构造器里面有:修饰符,名称,形参列表类型,方法体是拿不到的。
我们先拿构造器,然后修饰符,名称,形参列表类型。直接打印容易出事,所有拼接。
结果:私有的构造器也拿出来了。
接下来我们去看返回构造器和Person是不是一样。
Private 返回的是空。 Public: 返回 的是两个参数构造器。
补充:getSimpleName:简单的名字,把包名去掉。
getName:
getSimpleName:
通过反射机制获取方法:跟上述的一样想要那 全部就用getDeclaredMethods。
返回方法的结果:
接下来获取成员 变量:
结果 :
获取了这些,这个类基本透明了。
现在我们可以通过反射机制调用构造器实例化一个类的对象。
构造器实例化一个类的对象
调用我getDeclaredConstructor 或者 getConstructor(只能访问类中声明为公有的构造器)
参数 :[参数类型1,参数类型2,…]
无法直接访问的构造器不一定是私有 设置允许访问 constructor.setAccessible(true)
公有的方法:
通过形参列表去匹配构造器, 构造器重载的时候形参列表就能唯一确定构造器。
因为我拿到了你的构造器 ,直接通过构造器的newInstance方法创建了一个实例出来。
通过私有的构造器实例对象;
因为是私有的不是拿到就就能调用,如果想调用要开放权限,传入true打破封装。
设置允许访问 private 使用反射机制可以打破封装性,导致了 java 对象的属性不安全。
结果:
通过反射机制获取或者设置成员变量
获取私有的值,name:成员变量只需要名字就可以了,都是私有的所以必须设置权限为true. 设置值Set给Person对象,传入值“”“小张”。获取值。从哪个对象把值拿出来。
结果:
反射机制破坏单例模式
注意:这只是演示反射机制,在正常的开发中不能这样使用。
只有一个单列能挡住反射 ,通过枚举可以挡住反射。
先加载类,Class,from , 可能会报异常, Exception把所有异常都抛上来,
要实例一个类,要拿到构造器,
然后设置打破封装,这两个实例已经不相等了。
通过反射机制往List中添加任意类型的元素
注意:这只是演示反射机制,在正常的开发中不能这样使用
首先定义Integer,进行反射,通过实例获取它的类型,然后获取他的add方法,设置类型为Object(一切),然后添加任意类型对象。