`
遛遛遛
  • 浏览: 52427 次
  • 性别: Icon_minigender_1
  • 来自: 宁波
社区版块
存档分类
最新评论

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

    博客分类:
  • 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里的三个对象。

 

分享到:
评论

相关推荐

    你可以看到这个类对属性的存取方法(getter and setter method)使用了标准JavaBean命名约定,同时把类属性(field)的访问级别设成私有的(private)。这是推荐的设计,但并不是必须的。Hibernate也可以直接访问这些field,而使用访问方法(accessor method)的好处是提供了重构时的健壮性(robustness)。为了通过反射机制(Reflection)来实例化\

    你可以看到这个类对属性的存取方法(getter and setter method)使用了标准JavaBean命名约定,同时...为了通过反射机制(Reflection)来实例化这个类的对象,我们需要提供一个无参的构造器(no-argument constructor)。

    Java开发技术大全(500个源代码).

    listConstructors.java 利用反射机制获取构造器列表 listFields.java 利用反射机制获取成员属性列表 listMethods.java 利用反射机制获取成员方法列表 loadClass.java 动态装载一个类 Shape.java 一个用于测试的...

    Java开发详解.zip

    020513_【第5章:面向对象基础】_构造方法私有化笔记.pdf 020514_【第5章:面向对象基础】_对象数组笔记.pdf 020515_【第5章:面向对象基础】_内部类笔记.pdf 020516_〖第5章:面向对象基础〗_实例讲解—系统登陆...

    2024最新的面试题来了

    由于Java的反射机制可以绕过类的私有构造方法创建对象,导致单例对象不再唯一,可能引发安全风险。为了防止这种漏洞,可以在单例类的私有构造方法中添加逻辑判断,禁止通过反射创建多个实例。 JVM常用配置参数是指...

    21天学通Java-由浅入深

    191 10.1 什么是构造器 191 10.1.1 构造器的使用 191 10.1.2 被修饰的构造器 193 10.1.3 构造器方法与普通方法的区别 196 10.2 如何实例化一个对象 197 10.3 构造器的使用 199 10.3.1 构造器的调用 199 10.3.2 构造...

    JAVA面试题最全集

    描述反射机制的作用 62.如何读写一个文件? 63.在图形界面中,一个按钮如何处理鼠标点击事件? 64.在图形界面中,一个表格,如何实现编辑单元格时弹出下拉框? 65.如何加载图片? 66.什么是模态对话框? 67....

    Java经典编程源码基础例程300.zip

    实例078 利用反射重写toString()方法 119 第8章 字符串与包装类 121 实例079 将数字格式化为货币字符串 122 实例080 货币金额大写格式 123 实例081 String类格式化当前日期 125 实例082 字符串大小写转换 1

    Hibernate中文API

    所有的持久化类(persistent classes)都要求有无参的构造器,因为Hibernate必须使用Java反射机制来为你创建对象。构造器(constructor)的访问级别可以是private,然而当生成运行时代理(runtime proxy)的时候则...

    day021-反射和注解笔记和代码.rar

    1. CONSTRUCTOR:可以在构造器上使用注解 2. FIELD:可以在字段上使用注解 3. LOCAL_VARIABLE:可以在局部变量上使用注解 4. METHOD:可以在普通方法上使用注解 5. PACKAGE:可以...

    Java开发实战1200例(第1卷).(清华出版.李钟尉.陈丹丹).part3

    书名:《Java开发实战1200例(第I卷)》(清华大学出版社.李钟尉,陈丹丹) PDF格式扫描版,全书分为24章,共817页。2011年1月出版。 全书压缩打包成4部分,这是第3部分 注:本系列图书的第I、II卷再版时均相应改名为...

    eclipse安卓开发必备工具

    } } 发现居然也能调用成功,当时很惊讶,反射机制平时在以前的项目中也常使用,但不能构造只有私有构造函数的类。 自己做了一个简单例子: package study.spring.bean; import java.lang.reflect.Constructor; ...

    jTester使用指南(带书签).pdf

    访问私有变量 使用反射方式构造对象实例 第 7 章 在测试代码中使用Mock 静态mock,new MockUp的使用 mock构造函数和静态代码块 new MockUp和spring的集成 针对静态mock做断言 动态mock,new Expectations的使用

    javaSE代码实例

    10.1.2 访问限制修饰符与构造器 176 10.1.3 构造器与返回类型 179 10.2 创建对象 180 10.3 重载构造器 181 10.4 级联调用的构造器 182 10.4.1 构造器的调用流程及默认构造器 182 10.4.2 自定义构造器...

    JAVA核心知识点整理(有效)

    25 JAVA8 与元数据.................................................................................................................................25 2.4. 垃圾回收与算法 .................................

    Scala程序设计(第2版)

    8.8 调用父类构造器(与良好的面向对象设计) 226 8.9 嵌套类型 230 8.10 本章回顾与下一章提要 232 第9章 特征 233 9.1 Java 8中的接口 233 9.2 混入trait 234 9.3 可堆叠的特征 238 9.4 ...

    day020-继承加强和设计模式代码和笔记.rar

    私有化构造方法 2. 在类中创建一个对象,并且用private、static、final修饰 private为了避免在外部直接访问当前对象 static是为了在静态方法中可以返回当前类中的对象 final:可加可不加...

Global site tag (gtag.js) - Google Analytics