【转】Java利用反射机制访问私有化构造器
我们都知道,当一个类的构造方法被设为私有的时候(private),在其他类中是无法用new来实例化一个对象的。
但是有一种方法可以把带有私有构造器的类实例化出对象。
在java的反射机制中,可以通过Class.forName(类名).newInstance()来实例化一个对象,还可以获取类的所有方法和构造方法。
Constructor这个类,表示类构造器,即构造方法。在生成类对象的时候,会调用构造方法。
- //例子程序
- import java.lang.reflect.Constructor;
- import java.lang.reflect.InvocationTargetException;
- import java.lang.reflect.Type;
- import java.util.ArrayList;
- import java.util.List;
- public class PrivateClassInstanceTest {
- static List<PrivateClassInstance> list = new ArrayList<PrivateClassInstance>();
- @SuppressWarnings("unchecked")
- public static void main(String[] args) {
- Constructor<PrivateClassInstance>[] constructors = null;
- try {
- // 拿到构造器数组,测试类包含多个私有构造器
- constructors = (Constructor<PrivateClassInstance>[]) Class.forName(
- "PrivateClassInstance").getDeclaredConstructors();
- } catch (ClassNotFoundException e) {
- e.printStackTrace();
- }
- // 按类中定义的顺序输出构造器
- for (int i = 0; i < constructors.length; i++) {
- Constructor<PrivateClassInstance> con = constructors[i];
- System.out.print(con + " ---> ");
- // 输出构造器参数的全部类型
- Type types[] = con.getGenericParameterTypes();
- int typeNums = types.length;
- for (int j = 0; j < typeNums; j++) {
- System.out.print(types[j]);
- }
- System.out.print(" ===> ");
- con.setAccessible(true); // 得到私有访问权限,如果不设置,则无法实例化对象
- //实例化对象
- PrivateClassInstance p;
- try {
- if (typeNums == 1) {
- p = con.newInstance(1);
- } else if (typeNums == 2) {
- p = con.newInstance("Li","nK");
- } else {
- p = con.newInstance();
- }
- list.add(p);
- } catch (IllegalArgumentException e) {
- e.printStackTrace();
- } catch (InstantiationException e) {
- e.printStackTrace();
- } catch (IllegalAccessException e) {
- e.printStackTrace();
- } catch (InvocationTargetException e) {
- e.printStackTrace();
- }
- }
- for(PrivateClassInstance p : list) {
- System.out.println(p);
- }
- }
- }
- class PrivateClassInstance {
- private PrivateClassInstance(String a, String b) {
- System.out.println("has two param");
- }
- private PrivateClassInstance() {
- System.out.println("no param");
- }
- private PrivateClassInstance(int n) {
- System.out.println("has one param");
- }
- }
输出结果:
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利用反射机制访问私有化构造器的更多相关文章
- java利用反射机制判断对象的属性是否为空以及获取和设置该属性的值
1.java利用反射机制判断对象的属性是否为空: Map<String,String> validateMap = new LinkedHashMap<String, String& ...
- Java——利用反射机制将表单数据自动填充到JavaBean中
以一个案例介绍反射机制的一种常见的使用场景,以及具体实现. 1.本文案例 在编写Java Web应用程序时,使用表单提交数据是一个必不可少的环节,后台对于前台使用表单提交的数据需要能够从请求中解析,并 ...
- java 利用反射机制,获取实体所有属性和方法,并对属性赋值
一个普通的实体Person: private int id; private String name; private Date createdTime;...//其它字段// get set方法 . ...
- java利用反射机制获取list中的某个字段并以list形式返回
public static<T> List<Object> listToList(Collection<T> list,String fieldName) thro ...
- java利用反射调用类的某个方法
java利用反射机制 可以动态调用某个类的某个方法,在 扩展系统功能或提供对外接口时经常用的到. 代码如下: 打印类Print.java package com.test.reflct; /** * ...
- JAVA中利用反射机制进行对象和Map相互转换的方法
JAVA的反射机制主要作用是用来访问对象的属性.方法等等.所以,JAVA中对象和Map相互转换可以利用JAVA的反射机制来实现.例子如下: 一.对象转Map的方法 public static Map& ...
- java 中利用反射机制获取和设置实体类的属性值
摘要: 在java编程中,我们经常不知道传入自己方法中的实体类中到底有哪些方法,或者,我们需要根据用户传入的不同的属性来给对象设置不同的属性值,那么,java自带的反射机制可以很方便的达到这种目的,同 ...
- 面试题思考:什么是 Java 的反射机制
一.反射机制概述 Java 反射机制是在运行状态中,对于任意一个类,都能够获得这个类的所有属性和方法,对于任意一个对象都能够调用它的任意一个属性和方法.这种在运行时动态的获取信息以及动态调用对象的方法 ...
- Java 类反射机制分析
Java 类反射机制分析 一.反射的概念及在Java中的类反射 反射主要是指程序可以访问.检测和修改它本身状态或行为的一种能力.在计算机科学领域,反射是一类应用,它们能够自描述和自控制.这类应用通过某 ...
随机推荐
- ZH奶酪:Ubuntu 14.04配置LAMP(Linux、Apache、MySQL、PHP)
ZH奶酪:Ubuntu 14.04安装LAMP(Linux,Apache,MySQL,PHP) 之前已经介绍过LAMP的安装,这边文章主要讲解一下LAMP的配置. 1.配置Apache (1)调整Ke ...
- 【树莓派】服务配置相关2:基于RPi Desktop的服务配置
该文接续之前写过的一篇:[树莓派]服务配置相关. 这是我个人用来进行树莓派盒子安装配置的脚本,对于外部其他博友,可以部分参考,但不需要逐个引用. 现在有一定更新,部分按如下脚本来操作: step1: ...
- 微信小程序 - 使用字体图标(阿里云库)
实现 阿里图库:https://www.iconfont.cn/ CSS3:[attribute*=value] 选择器 步骤 1. 加入购物车 2. 下载代码解压,复制iconfont.css ap ...
- Container [pid=6263,containerID=container_1494900155967_0001_02_000001] is running beyond virtual memory limits
以Spark-Client模式运行,Spark-Submit时出现了下面的错误: User: hadoop Name: Spark Pi Application Type: SPARK Applica ...
- 使用VS2015开发asp程序让IIS express 允许的父路径的方法
一.Win7更好修改下面地址的文件: C:\Program Files (x86)\IIS Express\config\schema或C:\Program Files\IIS Express\con ...
- 【DB2】建造测试数据
建表语句 CREATE TABLE FUND_DAILY_INCOME ( ID BIGINT NOT NULL GENERATED ALWAYS AS IDENTIT ...
- C#并行编程-PLINQ:声明式数据并行-转载
C#并行编程-PLINQ:声明式数据并行 目录 C#并行编程-相关概念 C#并行编程-Parallel C#并行编程-Task C#并行编程-并发集合 C#并行编程-线程同步原语 C#并行编程-P ...
- 使用CodePush实时更新 React Native 和 Cordova 应用
近期公司的React native App(云订货)用上CodePush实时更新App技术了.棒棒的 CodePush 是微软开发的.能够实时更新 React Native 和 Cordova 应用. ...
- Spring中Autowired注解,Resource注解和xml default-autowire工作方式异同
前面说到了关于在xml中有提供default-autowire的配置信息,从spring 2.5开始,spring又提供了一个Autowired以及javaEE中标准的Resource注释,都好像可以 ...
- MAVEN 搭建APPFUSE
2010-05-21 利用Maven构建appfuse. 步骤如下: 1)Maven下载,下载apache-maven-2.2.1-bin.zip 下载地址:http://apache.freela ...