日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

利用反射机制创建新类的两种方式及比较

發布時間:2023/12/3 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 利用反射机制创建新类的两种方式及比较 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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

總結

以上是生活随笔為你收集整理的利用反射机制创建新类的两种方式及比较的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。