java 反射探究
程序员文章站
2023-11-08 08:25:58
反射的定义是一种动态获取类的内容,创建对象,以及动态调用对象的方法和操作其属性的机制。就是指在java程序运行中:给定一个类(class)对象,通过反射获取这个类(class)对象中所有的成员给定一个具体的new对象,能够调用它的所有方法以及对其所有的属性值进行获取和赋值获取class对象的4种方式类名.class对象名.getClass()Class.forName(“类的全路径”)类名.class.getClassLoader().loadClass(“类的全路径”)优缺点...
反射的定义
是一种动态获取类的内容,创建对象,以及动态调用对象的方法和操作其属性的机制。就是指在java程序运行中:
- 给定一个类(class)对象,通过反射获取这个类(class)对象中所有的成员
- 给定一个具体的new对象,能够调用它的所有方法以及对其所有的属性值进行获取和赋值
获取class对象的4种方式
- 类名.class
- 对象名.getClass()
- Class.forName(“类的全路径”)
- 类名.class.getClassLoader().loadClass(“类的全路径”)
优缺点
- 优点:
- 可以增加程序的灵活性,可以避免在程序中写死固有的代码
- 代码简洁,可读性强,可以提高代码的复用率
- 缺点:
- 存在内部暴露,可能会导致安全隐患
- 对于大量调用的情况下,性能低下
为什么反射在大量调用的情况下性能低?
- 反射开始的时候需要寻找class字节码,有这样一个过程
- 在newInstance()的时候会去进行权限判断
- 需要调用native方法是基于JNI接口的
了解class内部
我们知道当我们定义一个class类的时候,其实都是基于一个类的模板:
而以上这些内容,Class类中都提供了对应的获取方法进行获取。具体的获取方式jdk api文档。
反射会破坏单例模式
首先我们知道单例模式的主要特征:
- 私有化构造函数
- 全局唯一的公共访问点
单例的写法有很多种,这里就以饿汉式举例:
懒汉式:
public class Lazy {
private static Lazy Instance;
private Lazy {}
public static Lazy getInstance() {
if(Instance == null) {
Synchronized(Lazy.class) {
if(Instance == null) {
Instance = new Lazy();
}
}
}
return Instance;
}
}
反射如何破坏单例的?
public static void main(String[] args) {
Lazy lazyInstance = Lazy.getInstance();
Constructor con = Lazy.class.getDeclaredConstructor();
con.setAccessible(true);
Lazy lazyInstanceFlect = (Lazy)con.newInstance();
System.out.println(lazyInstance == lazyInstanceFlect);
}
本文地址:https://blog.csdn.net/weixin_44975291/article/details/112062304
上一篇: 用X光看穿苹果触控板妙控键盘:蝴蝶又被抛弃 回归经典剪刀脚
下一篇: 我一直都在假装爱你(组诗)