引用:http://xiaohuafyle.iteye.com/blog/1607258函數
經過反射建立新的類示例,有兩種方式:
Class.newInstance()
Constructor.newInstance()
如下對兩種調用方式給以比較說明:
Class.newInstance() 只可以調用無參的構造函數,即默認的構造函數;
Constructor.newInstance() 能夠根據傳入的參數,調用任意構造構造函數。
Class.newInstance() 拋出全部由被調用構造函數拋出的異常。
Class.newInstance() 要求被調用的構造函數是可見的,也即必須是public類型的;
Constructor.newInstance() 在特定的狀況下,能夠調用私有的構造函數。
Class A(被調用的示例): spa
- public class A {
- private A() {
- System.out.println("A's constructor is called.");
- }
-
- private A(int a, int b) {
- System.out.println("a:" + a + " b:" + b);
- }
- }
Class B(調用者): blog
- public class B {
- public static void main(String[] args) {
- B b=new B();
- out.println("經過Class.NewInstance()調用私有構造函數:");
- b.newInstanceByClassNewInstance();
- out.println("經過Constructor.newInstance()調用私有構造函數:");
- b.newInstanceByConstructorNewInstance();
- }
-
- private void newInstanceByClassNewInstance(){
- try {
- A a=(A)Class.forName("reflect.A").newInstance();
- } catch (Exception e) {
- out.println("經過Class.NewInstance()調用私有構造函數【失敗】");
- }
- }
-
-
- private void newInstanceByConstructorNewInstance(){
- try {
- Class c=Class.forName("A");
-
- Constructor c0=c.getDeclaredConstructor();
- c0.setAccessible(true);
- A a0=(A)c0.newInstance();
-
- Constructor c1=c.getDeclaredConstructor(new Class[]{int.class,int.class});
- c1.setAccessible(true);
- A a1=(A)c1.newInstance(new Object[]{5,6});
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
輸入結果以下:
經過Class.NewInstance()調用私有構造函數:
經過Class.NewInstance()調用私有構造函數【失敗】
經過Constructor.newInstance()調用私有構造函數:
A's constructor is called.
a:5 b:6
說明方法newInstanceByClassNewInstance調用失敗,而方法newInstanceByConstructorNewInstance則調用成功。
若是被調用的類的構造函數爲默認的構造函數,採用Class.newInstance()則是比較好的選擇,
一句代碼就OK;若是是老百姓調用被調用的類帶參構造函數、私有構造函數,
就須要採用Constractor.newInstance(),兩種狀況視使用狀況而定。
不過Java Totorial中推薦採用Constractor.newInstance()。 get