Java反射机制

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(一切),然后添加任意类型对象。
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值