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

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

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

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

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

输出结果:

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

【转】Java利用反射机制访问私有化构造器的更多相关文章

  1. java利用反射机制判断对象的属性是否为空以及获取和设置该属性的值

    1.java利用反射机制判断对象的属性是否为空: Map<String,String> validateMap = new LinkedHashMap<String, String& ...

  2. Java——利用反射机制将表单数据自动填充到JavaBean中

    以一个案例介绍反射机制的一种常见的使用场景,以及具体实现. 1.本文案例 在编写Java Web应用程序时,使用表单提交数据是一个必不可少的环节,后台对于前台使用表单提交的数据需要能够从请求中解析,并 ...

  3. java 利用反射机制,获取实体所有属性和方法,并对属性赋值

    一个普通的实体Person: private int id; private String name; private Date createdTime;...//其它字段// get set方法 . ...

  4. java利用反射机制获取list中的某个字段并以list形式返回

    public static<T> List<Object> listToList(Collection<T> list,String fieldName) thro ...

  5. java利用反射调用类的某个方法

    java利用反射机制 可以动态调用某个类的某个方法,在 扩展系统功能或提供对外接口时经常用的到. 代码如下: 打印类Print.java package com.test.reflct; /** * ...

  6. JAVA中利用反射机制进行对象和Map相互转换的方法

    JAVA的反射机制主要作用是用来访问对象的属性.方法等等.所以,JAVA中对象和Map相互转换可以利用JAVA的反射机制来实现.例子如下: 一.对象转Map的方法 public static Map& ...

  7. java 中利用反射机制获取和设置实体类的属性值

    摘要: 在java编程中,我们经常不知道传入自己方法中的实体类中到底有哪些方法,或者,我们需要根据用户传入的不同的属性来给对象设置不同的属性值,那么,java自带的反射机制可以很方便的达到这种目的,同 ...

  8. 面试题思考:什么是 Java 的反射机制

    一.反射机制概述 Java 反射机制是在运行状态中,对于任意一个类,都能够获得这个类的所有属性和方法,对于任意一个对象都能够调用它的任意一个属性和方法.这种在运行时动态的获取信息以及动态调用对象的方法 ...

  9. Java 类反射机制分析

    Java 类反射机制分析 一.反射的概念及在Java中的类反射 反射主要是指程序可以访问.检测和修改它本身状态或行为的一种能力.在计算机科学领域,反射是一类应用,它们能够自描述和自控制.这类应用通过某 ...

随机推荐

  1. 很好的vmware目录

    http://www.globalknowledge.com/training/course.asp?pageid=9&courseid=18023&country=United+St ...

  2. 【Python】文件读写操作

    Python的文件读写有点类似php的文件读写.php的文件读写已经在<[php]让记事本成为你调控变量的控制台>(点击打开链接)说过了,以下用一个小样例说明Python的文件读写. 在F ...

  3. SDUT 1269-走迷宫(DFS打印路径)

    走迷宫 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描写叙述 有一个m*n格的迷宫(表示有m行.n列),当中有可走的也有不可走的,假 ...

  4. java 生成二维码、可带LOGO、可去白边

      1.准备工作 所需jar包: JDK 1.6: commons-codec-1.11.jar core-2.2.jar javase-2.2.jar JDK 1.7: commons-codec- ...

  5. Yii2框架bootstrap样式理解

    Yii2框架默认採用了bootstrap作为CSS风格,各种视图类组件都如此.之前一直採用默认风格,并在必要的时候加入或者改动一下class来达到目的.但在改版Yii1.1的orange项目时.发现之 ...

  6. 【BI】OLTP与OLAP的区别

    概念 OLTP:联机事务处理(On-Line transaction Processing) OLAP:联机分析处理(On-Line Analytical Processing) (1)OLTP是传统 ...

  7. [转]SVN更新的时候前面字母的意思(U、G、A、R、C)

    U:update 表示从服务器收到文件更新了 G:表示本地文件以及服务器文件都已更新,而且成功的合并了 其他的如下: A:added 表示有文件或者目录添加到工作目录 R:replace 表示文件或者 ...

  8. weblogic服务目录迁移记录

    weblogic服务,由于前期的规划不好,导致后期有点问题!为了更加规范运行服务及执行相关操作,故进行服务迁移... 先决条件:weblogic都是单个aminserver运行的,单个服务 问题解决: ...

  9. Ubuntu下安装软件、卸载

    Ubuntu下安装软件.卸载 一般的安装程序有三种: .deb和.rpm这2中安装文件 .boudle这是二进制安装文件 .tar.gz文件是压缩包,与.rar和.zip压缩包一样,安装此类文件需要先 ...

  10. Node.js的一些基本概念

    1. Node.js简介 1.1 Node.js是什么 简单的说 Node.js 就是运行在服务端的 JavaScript. Node.js是一个能够在服务器端运行JavaScript的开放源代码.跨 ...