Java用反射reflect来实例化对象: class.getDeclaredConstructor().newInstance()

Java用反射reflect来实例化对象: class.getDeclaredConstructor().newInstance() 从java9开始, class.newInstance()已过时, 被加上@Deprecated强烈反对注解

java 复制代码
   @SuppressWarnings("removal")
   @CallerSensitive
   @Deprecated(since="9")
   public T newInstance()
       throws InstantiationException, IllegalAccessException
   {......}

现用 class.getDeclaredConstructor(Class<?>... parameterTypes).newInstance(Object ... initargs) 步骤:

  1. 获取Class, 如Class.forName("全类名") , 类名.class , 实例.getClass()
  2. getDeclaredConstructor(Class<?>... parameterTypes) 方法, 获取 Constructor<?>
  3. newInstance(Object ... initargs) 方法,获取实例

例如

构造方法无参

java 复制代码
Class.forName("全类名").getDeclaredConstructor().newInstance();
java 复制代码
Class.forName(Thread.currentThread().getStackTrace()[1].getClassName()).getDeclaredConstructor().newInstance();
java 复制代码
try {
	Class.forName(Thread.currentThread().getStackTrace()[1].getClassName()).getDeclaredConstructor().newInstance();
} catch (InstantiationException e) {
	e.printStackTrace();
} catch (IllegalAccessException e) {
	e.printStackTrace();
} catch (IllegalArgumentException e) {
	e.printStackTrace();
} catch (InvocationTargetException e) {
	e.printStackTrace();
} catch (NoSuchMethodException e) {
	e.printStackTrace();
} catch (SecurityException e) {
	e.printStackTrace();
} catch (ClassNotFoundException e) {
	e.printStackTrace();
}
java 复制代码
try {
	Class.forName(Thread.currentThread().getStackTrace()[1].getClassName()).getDeclaredConstructor().newInstance();
} catch (Exception e) {	e.printStackTrace();}

有一个String参数的构造方法

java 复制代码
Frame frame =
 	(Frame)Class.forName("java.awt.Frame")
 		.getDeclaredConstructor(String.class)
 			.newInstance("Frame标题");

一些摘抄

摘抄1

在Java中,你可以使用反射(Reflection)来实例化对象。反射允许程序在运行时查看类的内部结构,如方法、字段等,并可以动态地调用方法或访问字段。

下面是一个使用反射来实例化对象的简单示例:

java 复制代码
import java.lang.reflect.Constructor;

public class ReflectionExample {

    public static void main(String[] args) {
        try {
            // 获取Class对象,这里我们使用String类作为示例
            Class<?> clazz = Class.forName("java.lang.String");

            // 获取构造方法,这里我们获取无参构造方法
            Constructor<?> constructor = clazz.getDeclaredConstructor();

            // 由于默认构造方法可能是私有的(在String类的情况下),我们需要设置为可访问
            constructor.setAccessible(true);

            // 使用构造方法实例化对象
            Object obj = constructor.newInstance();

            // 输出实例化后的对象类型
            System.out.println("Instantiated object of type: " + obj.getClass().getName());

            // 注意:对于String类,直接使用构造方法实例化可能不会得到你期望的结果,因为String类内部有缓存机制
            // 这里只是为了演示反射的使用,通常你不会直接这样实例化String对象

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
    }
}

注意:

  1. 使用反射时,需要处理多个异常,因为反射操作可能会失败。
  2. 在这个示例中,我们使用了String类作为示例,但通常你不会这样直接实例化String对象,因为String类有自己的缓存机制。
  3. 如果你知道构造方法需要参数,你可以使用getDeclaredConstructor(Class<?>... parameterTypes)方法来获取对应的构造方法,并使用newInstance(Object... initargs)方法来传递参数。
  4. 当你使用反射调用私有方法或访问私有字段时,可能需要使用setAccessible(true)来绕过Java的访问控制。但是请注意,这样做可能会破坏封装性,应该谨慎使用。
相关推荐
南极星100517 小时前
蓝桥杯JAVA--启蒙之路(十)class版本 模块
java·开发语言
消失的旧时光-194317 小时前
第十三课:权限系统如何设计?——RBAC 与 Spring Security 架构
java·架构·spring security·rbac
不能隔夜的咖喱17 小时前
牛客网刷题(2)
java·开发语言·算法
serve the people18 小时前
python环境搭建 (十二) pydantic和pydantic-settings类型验证与解析
java·网络·python
lekami_兰18 小时前
Java 并发工具类详解:4 大核心工具 + 实战场景,告别 synchronized
java·并发工具
有位神秘人18 小时前
Android中Notification的使用详解
android·java·javascript
tb_first19 小时前
LangChain4j简单入门
java·spring boot·langchain4j
独自破碎E19 小时前
【BISHI9】田忌赛马
android·java·开发语言
范纹杉想快点毕业19 小时前
实战级ZYNQ中断状态机FIFO设计
java·开发语言·驱动开发·设计模式·架构·mfc
smileNicky20 小时前
布隆过滤器怎么提高误差率
java