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的访问控制。但是请注意,这样做可能会破坏封装性,应该谨慎使用。
相关推荐
新手小袁_J11 分钟前
JDK11下载安装和配置超详细过程
java·spring cloud·jdk·maven·mybatis·jdk11
呆呆小雅11 分钟前
C#关键字volatile
java·redis·c#
Monly2112 分钟前
Java(若依):修改Tomcat的版本
java·开发语言·tomcat
Ttang2314 分钟前
Tomcat原理(6)——tomcat完整实现
java·tomcat
钱多多_qdd25 分钟前
spring cache源码解析(四)——从@EnableCaching开始来阅读源码
java·spring boot·spring
waicsdn_haha27 分钟前
Java/JDK下载、安装及环境配置超详细教程【Windows10、macOS和Linux图文详解】
java·运维·服务器·开发语言·windows·后端·jdk
Q_192849990637 分钟前
基于Spring Boot的摄影器材租赁回收系统
java·spring boot·后端
Code_流苏40 分钟前
VSCode搭建Java开发环境 2024保姆级安装教程(Java环境搭建+VSCode安装+运行测试+背景图设置)
java·ide·vscode·搭建·java开发环境
禁默1 小时前
深入浅出:AWT的基本组件及其应用
java·开发语言·界面编程
Cachel wood1 小时前
python round四舍五入和decimal库精确四舍五入
java·linux·前端·数据库·vue.js·python·前端框架