newInstance() 的參數版本與無參數版本


通過反射創建新的類示例,有兩種方式: 
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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM