1. 程式人生 > >利用反射機制建立新類的兩種方式及比較

利用反射機制建立新類的兩種方式及比較

【0】README

【1】通過反射建立新的類示例,有兩種方式:

2.1)第一種方式: Class.newInstance()
2.2)第二種方式: Constructor.newInstance()

【2】以下對兩種呼叫方式給以比較說明:

2.1)呼叫的建構函式有無引數: Class.newInstance() 只能夠呼叫無參的建構函式,即預設的建構函式;而Constructor.newInstance() 可以根據傳入的引數,呼叫任意建構函式(包括有參+無參);
2.2)是否丟擲異常: Class.newInstance() 丟擲所有由被呼叫建構函式丟擲的異常;
2.3)呼叫的建構函式的可見性:

Class.newInstance() 要求被呼叫的建構函式是可見的,也即必須是public型別的;而 Constructor.newInstance() 在特定的情況下,可以呼叫私有的建構函式(private);

【3】看個荔枝

3.1)A.java

package com.corejava.chapter5;

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); } }

3.2)B.java

package com.corejava.chapter5;
import java.lang.reflect.Constructor;
import static java.lang.System.out;

public class B
{
    public static void main(String[] args)
    {
        B b; 

        b = new B();
        out.println("通過Class.NewInstance()呼叫私有建構函式:"
); b.newInstanceByClassNewInstance(); out.println("通過Constructor.newInstance()呼叫私有建構函式:"); b.newInstanceByConstructorNewInstance(); } /* 通過Class.NewInstance()建立新的類示例 */ private void newInstanceByClassNewInstance() { try { /* 當前包名為reflect,必須使用全路徑 */ A a = (A) Class.forName("com.corejava.chapter5.A").newInstance(); } catch (Exception e) { out.println("通過Class.NewInstance()呼叫私有建構函式【失敗】"); } } /* 通過Constructor.newInstance()建立新的類示例 */ private void newInstanceByConstructorNewInstance() { try { /* 可以使用相對路徑,同一個包中可以不用帶包路徑 */ Class c = Class.forName("com.corejava.chapter5.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(); } } }

這裡寫圖片描述