今天看到问答里有人发了一个关于反射的问题,是如何利用反射来获取类的私有构造函数并进行类的实例化的,由此想到Java提供private关键字就是用来控制类的成员变量和方法在外部无法可见,那么使用反射能够获取到类的私有构造函数,成员变量和方法,并对其进行操作,那么这样做是否破坏了程序的封装性呢?
有人说无法实现访问调用私有的构造函数,再次实践证明。
package com.dream.reflection;
/**
* Created by IntelliJ IDEA.
* User: Zhong Gang
* Date: 11-9-24
* Time: 下午7:02
*/
public class User {
private Integer id;
private int number;
private String name;
private User(Integer id) {
this.id = id;
}
private User(int number) {
this.number = number;
}
private User(String name) {
this.name = name;
}
private User(Integer id, String name) {
this.id = id;
this.name = name;
}
public Integer getId() {
return id;
}
public String getName() {
return name;
}
public int getNumber() {
return number;
}
}
package com.dream.reflection;
import junit.framework.TestCase;
import java.lang.reflect.Constructor;
/**
* Created by IntelliJ IDEA.
* User: Zhong Gang
* Date: 11-9-24
* Time: 下午7:03
*/
public class UserRelectionTest extends TestCase {
public void testConstructorReflection() throws Exception {
Class<User> clazz = User.class;
Constructor<User> constructor = clazz.getDeclaredConstructor(Integer.class);
constructor.setAccessible(true);
User user = constructor.newInstance(Integer.valueOf("1"));
assertEquals(Integer.valueOf("1"), user.getId());
}
public void testIntReflection() throws Exception {
Class<User> clazz = User.class;
Constructor<User> constructor = clazz.getDeclaredConstructor(int.class);
constructor.setAccessible(true);
User user = constructor.newInstance(1);
assertEquals(1, user.getNumber());
}
public void testStringReflection() throws Exception {
Class<User> clazz = User.class;
Constructor<User> constructor = clazz.getDeclaredConstructor(String.class);
constructor.setAccessible(true);
User user = constructor.newInstance("ZhongGang");
assertEquals("ZhongGang", user.getName());
}
}
分享到:
相关推荐
C#发现之旅:使用反射和特性构造自己的ORM框架实用.pdf
使用java反射机制封装javabean 项目当中使用的一个通用的方法
antiBC:抗反射 NeumannBC:反射 periodBC:周期 zeroBC:零
使用 Java 反射封装 JavaBean <br> 说明:这个程序在没有使用Hiberante时挺有用的 需要一个数据库查询语句 对应的JavaBean的全名(现在是Class,原来Class.getName()) 返回List包含多个JavaBean
Java试题-5:应用反射创建对象,调用对象方法 反射为Java的高级技术应用
车灯反射 车灯 程序 2002年全国数学建模竞赛题 B题 2002年全国数学建模竞赛题B题,车灯反射 车灯 程序 2002年全国数学建模竞赛题 B题 2002年全国数学建模竞赛题B题
java反射例子,封装了一个反射帮助类,解压,加载到myeclipse上可用;java反射例子,封装了一个反射帮助类,解压,加载到myeclipse上可用;
Java EE:Reflect 反射技术.docx
Intelligent Reflecting Surface-Aided Wireless Communications: A Tutorial 论文分享:智能反射面综述、教程
信号沿传输线向前传播时,...如果信号感受到的阻抗是恒定的,那么他就会正常向前传播,只要感受到的阻抗发生变化,不论是什么引起的(可能是中途遇到的电阻,电容,电感,过孔,PCB转角,接插件),信号都会发生反射。
这些功能是: 使用反射和递归来处理对象中的每个属性。 尊重瞬态属性。 对于特定于应用程序的类,在 json 中打印完全限定的类名以及键“className” 支持扩展转换助手的框架我如何使用它? 使用 newInstance() 获取...
在Java中,反射是一种机制,它允许程序在运行时获取和操作类的信息,包括类的构造器、字段、方法等。通过反射,我们可以在编译时期未知类的情况下,动态地操作类的成员。
基于泛型反射的数据层封装+MSSQLJDBC3.0驱动 CSDN学生大本营文章代码
C# 程序集 类型加载 反射 C# 程序集 类型加载 反射 QQ:292258449
C#反射其它DLL的封装应用,支持方法、参数、对象的调用。
论文分享:智能反射面辅助的上行NOMA系统低功耗传输方案研究
万能的反射封装接口,值得下载参考,当成util
论文分享:智能反射面辅助的非正交多址系统高能效传输方案研究
程序集、反射和特性小示例反射实现的接口 反射方法参数和返回值
通过反射,程序可以在运行时检查类、实例化对象、调用方法、获取和设置属性,甚至可以动态修改类的结构。 Java反射技术的核心在于java.lang.reflect包,它提供了一系列类和接口,用于在运行时获取关于类和对象的...