zoukankan      html  css  js  c++  java
  • 【转】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

  • 相关阅读:
    学习笔记: js插件 —— fullPage.js (页面全屏滚动)
    学习笔记: js插件 —— SuperSlide 2 (轮播图插件,PC用)
    学习笔记:jqchart
    学习笔记:Highcharts
    js: 字符集
    代码:PC HTML——图片列表
    教程:给初学的几个小例子(待补充)
    代码: html 页面小效果 (集合,待补充)
    MongoDB
    mongodb权限机制以及扩展
  • 原文地址:https://www.cnblogs.com/qqzy168/p/3615380.html
Copyright © 2011-2022 走看看