利用反射机制创建新类的两种方式及比较
生活随笔
收集整理的這篇文章主要介紹了
利用反射机制创建新类的两种方式及比较
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
【0】README
0.1) 本文描述+源代碼均 轉自 http://blog.csdn.net/fenglibing/article/details/4531033 , 旨在深入理解 如何利用反射機制創建類實例;
0.2) 轉載的源代碼,參見 https://github.com/pacosonTang/core-java-volume/tree/master/chapter5/reflectionCreateInstance
【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();}} }總結
以上是生活随笔為你收集整理的利用反射机制创建新类的两种方式及比较的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 万网主机怎么远程(万网主机怎么远程开机)
- 下一篇: java接口概述