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

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

   @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) 方法,获取实例

例如

构造方法无参

Class.forName("全类名").getDeclaredConstructor().newInstance();
Class.forName(Thread.currentThread().getStackTrace()[1].getClassName()).getDeclaredConstructor().newInstance();
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();
}
try {
	Class.forName(Thread.currentThread().getStackTrace()[1].getClassName()).getDeclaredConstructor().newInstance();
} catch (Exception e) {	e.printStackTrace();}

有一个String参数的构造方法

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




在这里插入图片描述

一些摘抄

摘抄1

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

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

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的访问控制。但是请注意,这样做可能会破坏封装性,应该谨慎使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kfepiza

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值