【转】Java利用反射机制访问私有化构造器

我们都知道,当一个类的构造方法被设为私有的时候(private),在其他类中是无法用new来实例化一个对象的。

但是有一种方法可以把带有私有构造器的类实例化出对象。

在java的反射机制中,可以通过Class.forName(类名).newInstance()来实例化一个对象,还可以获取类的所有方法和构造方法。

Constructor这个类,表示类构造器,即构造方法。在生成类对象的时候,会调用构造方法。

Java代码  收藏代码
  1. //例子程序  
  2.   
  3. import java.lang.reflect.Constructor;  
  4. import java.lang.reflect.InvocationTargetException;  
  5. import java.lang.reflect.Type;  
  6. import java.util.ArrayList;  
  7. import java.util.List;  
  8.   
  9. public class PrivateClassInstanceTest {  
  10.   
  11.     static List<PrivateClassInstance> list = new ArrayList<PrivateClassInstance>();  
  12.   
  13.     @SuppressWarnings("unchecked")  
  14.     public static void main(String[] args) {  
  15.   
  16.         Constructor<PrivateClassInstance>[] constructors = null;  
  17.         try {  
  18.             // 拿到构造器数组,测试类包含多个私有构造器  
  19.             constructors = (Constructor<PrivateClassInstance>[]) Class.forName(  
  20.                     "PrivateClassInstance").getDeclaredConstructors();  
  21.         } catch (ClassNotFoundException e) {  
  22.             e.printStackTrace();  
  23.         }  
  24.   
  25.         // 按类中定义的顺序输出构造器  
  26.         for (int i = 0; i < constructors.length; i++) {  
  27.             Constructor<PrivateClassInstance> con = constructors[i];  
  28.   
  29.             System.out.print(con + " ---> ");  
  30.   
  31.             // 输出构造器参数的全部类型  
  32.             Type types[] = con.getGenericParameterTypes();  
  33.   
  34.             int typeNums = types.length;  
  35.   
  36.             for (int j = 0; j < typeNums; j++) {  
  37.                 System.out.print(types[j]);  
  38.             }  
  39.             System.out.print(" ===> ");  
  40.               
  41.   
  42.             con.setAccessible(true); // 得到私有访问权限,如果不设置,则无法实例化对象  
  43.   
  44.             //实例化对象  
  45.             PrivateClassInstance p;  
  46.             try {  
  47.                 if (typeNums == 1) {  
  48.                     p = con.newInstance(1);  
  49.                 } else if (typeNums == 2) {  
  50.                     p = con.newInstance("Li","nK");  
  51.                 } else {  
  52.                     p = con.newInstance();  
  53.                 }  
  54.                 list.add(p);  
  55.             } catch (IllegalArgumentException e) {  
  56.                 e.printStackTrace();  
  57.             } catch (InstantiationException e) {  
  58.                 e.printStackTrace();  
  59.             } catch (IllegalAccessException e) {  
  60.                 e.printStackTrace();  
  61.             } catch (InvocationTargetException e) {  
  62.                 e.printStackTrace();  
  63.             }  
  64.   
  65.         }  
  66.           
  67.         for(PrivateClassInstance p : list) {  
  68.             System.out.println(p);  
  69.         }  
  70.   
  71.     }  
  72. }  
  73.   
  74. class PrivateClassInstance {  
  75.   
  76.     private PrivateClassInstance(String a, String b) {  
  77.         System.out.println("has two param");  
  78.     }  
  79.   
  80.     private PrivateClassInstance() {  
  81.         System.out.println("no param");  
  82.     }  
  83.   
  84.     private PrivateClassInstance(int n) {  
  85.         System.out.println("has one param");  
  86.     }  
  87.   
  88. }  
 

输出结果:

private PrivateClassInstance(java.lang.String,java.lang.String) ---> class java.lang.Stringclass java.lang.String ===> has two param

private PrivateClassInstance() --->  ===> no param

private PrivateClassInstance(int) ---> int ===> has one param

PrivateClassInstance@c17164

PrivateClassInstance@1fb8ee3

PrivateClassInstance@61de33

最后打印出保存在list里的三个对象。

原文出处:http://wojiaorara.iteye.com/blog/1418359

原文地址:https://www.cnblogs.com/qqzy168/p/3615380.html