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的訪問控制。但是請注意,這樣做可能會破壞封裝性,應該謹慎使用。