通過反射創建新的類示例,有兩種方式:
Class.newInstance()
Constructor.newInstance()
以下對兩種調用方式給以比較說明:
Class.newInstance() 只能夠調用無參的構造函數,即默認的構造函數;
Constructor.newInstance() 可以根據傳入的參數,調用任意構造構造函數。
Class.newInstance() 要求被調用的構造函數是可見的,也即必須是public類型的;
Constructor.newInstance() 在特定的情況下,可以調用私有的構造函數,需要通過setAccessible(true)實現。
下面是兩種方式:
package com.reflect; import java.lang.reflect.Constructor; class TestB { public TestB() { System.out.println("Test A"); } //設置構造方法私有 private TestB(int a,String b) { System.out.println("Test parames"); } } public class Test { public static void main(String []args) throws Exception { Test b=new Test(); Class c=Class.forName("com.reflect.TestB"); //無參數 TestB b1=(TestB) c.newInstance(); //有參數需要使用Constructor類對象 //這種方式和下面這種方式都行,注意這里的參數類型是 new Class[] //Constructor ct=c.getDeclaredConstructor(int.class,String.class); Constructor ct=c.getDeclaredConstructor(new Class[]{int.class,String.class}); ct.setAccessible(true); //這種方式和下面這種方式都可以:注意這里的參數類型是 new Object[] //TestB b2=(TestB) ct.newInstance(1,"2"); TestB b2=(TestB) ct.newInstance(new Object[] {1,"2"}); } }
運行結果:
Test A
Test parames