利用反射机制创建新类的两种方式及比较
【0】README
0.1) 本文描述+源代碼均 轉(zhuǎn)自 http://blog.csdn.net/fenglibing/article/details/4531033 , 旨在深入理解 如何利用反射機(jī)制創(chuàng)建類(lèi)實(shí)例; 
 0.2) 轉(zhuǎn)載的源代碼,參見(jiàn) https://github.com/pacosonTang/core-java-volume/tree/master/chapter5/reflectionCreateInstance
【1】通過(guò)反射創(chuàng)建新的類(lèi)示例,有兩種方式:
2.1)第一種方式: Class.newInstance() 
 2.2)第二種方式: Constructor.newInstance()
【2】以下對(duì)兩種調(diào)用方式給以比較說(shuō)明:
2.1)調(diào)用的構(gòu)造函數(shù)有無(wú)參數(shù): Class.newInstance() 只能夠調(diào)用無(wú)參的構(gòu)造函數(shù),即默認(rèn)的構(gòu)造函數(shù);而Constructor.newInstance() 可以根據(jù)傳入的參數(shù),調(diào)用任意構(gòu)造函數(shù)(包括有參+無(wú)參); 
 2.2)是否拋出異常: Class.newInstance() 拋出所有由被調(diào)用構(gòu)造函數(shù)拋出的異常; 
 2.3)調(diào)用的構(gòu)造函數(shù)的可見(jiàn)性: Class.newInstance() 要求被調(diào)用的構(gòu)造函數(shù)是可見(jiàn)的,也即必須是public類(lèi)型的;而 Constructor.newInstance() 在特定的情況下,可以調(diào)用私有的構(gòu)造函數(shù)(private);
【3】看個(gè)荔枝
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("通過(guò)Class.NewInstance()調(diào)用私有構(gòu)造函數(shù):");b.newInstanceByClassNewInstance();out.println("通過(guò)Constructor.newInstance()調(diào)用私有構(gòu)造函數(shù):");b.newInstanceByConstructorNewInstance();}/* 通過(guò)Class.NewInstance()創(chuàng)建新的類(lèi)示例 */private void newInstanceByClassNewInstance(){try{/* 當(dāng)前包名為reflect,必須使用全路徑 */A a = (A) Class.forName("com.corejava.chapter5.A").newInstance();} catch (Exception e){out.println("通過(guò)Class.NewInstance()調(diào)用私有構(gòu)造函數(shù)【失敗】");}}/* 通過(guò)Constructor.newInstance()創(chuàng)建新的類(lèi)示例 */private void newInstanceByConstructorNewInstance(){try{/* 可以使用相對(duì)路徑,同一個(gè)包中可以不用帶包路徑 */Class c = Class.forName("com.corejava.chapter5.A");/* 以下調(diào)用無(wú)參的、私有構(gòu)造函數(shù) */Constructor c0 = c.getDeclaredConstructor();c0.setAccessible(true);A a0 = (A) c0.newInstance();/* 以下調(diào)用帶參的、私有構(gòu)造函數(shù) */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();}} }總結(jié)
以上是生活随笔為你收集整理的利用反射机制创建新类的两种方式及比较的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
 
                            
                        - 上一篇: 万网主机怎么远程(万网主机怎么远程开机)
- 下一篇: java接口概述
