欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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种方式

  1. 类名.class
  2. 对象名.getClass()
  3. Class.forName(“类的全路径”)
  4. 类名.class.getClassLoader().loadClass(“类的全路径”)

优缺点

  • 优点:
    • 可以增加程序的灵活性,可以避免在程序中写死固有的代码
    • 代码简洁,可读性强,可以提高代码的复用率
  • 缺点:
    • 存在内部暴露,可能会导致安全隐患
    • 对于大量调用的情况下,性能低下

为什么反射在大量调用的情况下性能低?

  1. 反射开始的时候需要寻找class字节码,有这样一个过程
  2. 在newInstance()的时候会去进行权限判断
  3. 需要调用native方法是基于JNI接口的

了解class内部

我们知道当我们定义一个class类的时候,其实都是基于一个类的模板:
java 反射探究
而以上这些内容,Class类中都提供了对应的获取方法进行获取。具体的获取方式jdk api文档。

反射会破坏单例模式

首先我们知道单例模式的主要特征:

  1. 私有化构造函数
  2. 全局唯一的公共访问点
    单例的写法有很多种,这里就以饿汉式举例:

懒汉式:

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