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)
步骤:
- 获取Class, 如
Class.forName("全类名")
,类名.class
,实例.getClass()
- 用
getDeclaredConstructor(Class<?>... parameterTypes)
方法, 获取Constructor<?>
- 用
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();
}
}
}
注意:
- 使用反射时,需要处理多个异常,因为反射操作可能会失败。
- 在这个示例中,我们使用了
String
类作为示例,但通常你不会这样直接实例化String
对象,因为String
类有自己的缓存机制。 - 如果你知道构造方法需要参数,你可以使用
getDeclaredConstructor(Class<?>... parameterTypes)
方法来获取对应的构造方法,并使用newInstance(Object... initargs)
方法来传递参数。 - 当你使用反射调用私有方法或访问私有字段时,可能需要使用
setAccessible(true)
来绕过Java的访问控制。但是请注意,这样做可能会破坏封装性,应该谨慎使用。