今天看到问答里有人发了一个关于反射的问题,是如何利用反射来获取类的私有构造函数并进行类的实例化的,由此想到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());
}
}