锁定老帖子 主题:使用反射是否破坏了程序的封装性
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (3)
|
|
---|---|
作者 | 正文 |
发表时间:2011-09-24
jacky1118sally 写道 防君子 不防小人嘛
这个 也无可厚非 正解! |
|
返回顶楼 | |
发表时间:2011-09-24
反射主要会破坏程序的封装性,但它主要是供工具构造者使用,应用开发中应用较少。
|
|
返回顶楼 | |
发表时间:2011-09-24
最后修改:2011-09-24
引用 运行时还能把私有改成共有? 第一次听说 ... 这么说, Java的沙箱模型就跟摆设一样了。 当然可以 setAccessible public void setAccessible(boolean flag) throws SecurityException将此对象的 accessible 标志设置为指示的布尔值。值为 true 则指示反射的对象在使用时应该取消 Java 语言访问检查。值为 false 则指示反射的对象应该实施 Java 语言访问检查。 首先,如果存在安全管理器,则在 ReflectPermission("suppressAccessChecks") 权限下调用 checkPermission 方法。 如果 flag 为 true,并且不能更改此对象的可访问性(例如,如果此元素对象是 Class 类的 Constructor 对象),则会引发 SecurityException。 如果此对象是 java.lang.Class 类的 Constructor 对象,并且 flag 为 true,则会引发 SecurityException。 参数: flag - accessible 标志的新值 抛出: SecurityException - 如果请求被拒绝。 另请参见: SecurityManager.checkPermission(java.security.Permission), RuntimePermission |
|
返回顶楼 | |
发表时间:2011-09-24
学习了,反射机制
|
|
返回顶楼 | |
发表时间:2011-09-24
我也觉得这个问题本身就问得有问题,通过反射能执行private方法吗,大家有没有测试过啊,我测试过好像是不行的。
|
|
返回顶楼 | |
发表时间:2011-09-24
来好意思,是我没见识,java还真提供了这么种操作private的方法,以前还真没见过。不过就算是这样,有何破坏不破坏,封装讲得是主流,不是每个地方都必须要这样做,特殊的地方还是得特殊处理,不要死搬概念,
|
|
返回顶楼 | |
发表时间:2011-09-24
反射的效率是不是比创建对象然后调用,损耗要大?
|
|
返回顶楼 | |
发表时间:2011-09-24
22cgreen 写道 我也觉得这个问题本身就问得有问题,通过反射能执行private方法吗,大家有没有测试过啊,我测试过好像是不行的。
看下面的测试,在外部对私有构造函数进行了调用来构造一个实例。你所说的不行?请问你的Java版本和代码是否正确? 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()); } } |
|
返回顶楼 | |
发表时间:2011-09-24
xiaoliefengfeng 写道 借着楼主的帖子 问问反射,今天上午我在论坛发了一个反射的提问
问题如下 public class Address { private int id; private String addr; private Address(int id) { this.id = id; } private Address(String addr) { this.addr = addr; } public static void main(String[] args) throws Throwable { Class<Address> addClass = Address.class; // 下面的反射不能成功运行,为什么了????, // 如果把构造函数改成private Address(Integer id),却可以 // 如果我想private Address(int id)这样也能反射,应该怎么解决 Constructor<Address> addConstructor = addClass .getDeclaredConstructor(Integer.class); Address address = addConstructor.newInstance(1); System.out.println(address.id); // 此反射可以运行 // Constructor<Address> addConstructor = addClass // .getDeclaredConstructor(String.class); // Address address = addConstructor.newInstance("北京"); // System.out.println(address.addr); } } 说的就是你,难道没有感觉到我的问题中提到的就是你吗? |
|
返回顶楼 | |
发表时间:2011-09-24
xiaoliefengfeng 写道 借着楼主的帖子 问问反射,今天上午我在论坛发了一个反射的提问
问题如下 public class Address { private int id; private String addr; private Address(int id) { this.id = id; } private Address(String addr) { this.addr = addr; } public static void main(String[] args) throws Throwable { Class<Address> addClass = Address.class; // 下面的反射不能成功运行,为什么了????, // 如果把构造函数改成private Address(Integer id),却可以 // 如果我想private Address(int id)这样也能反射,应该怎么解决 Constructor<Address> addConstructor = addClass .getDeclaredConstructor(Integer.class); Address address = addConstructor.newInstance(1); System.out.println(address.id); // 此反射可以运行 // Constructor<Address> addConstructor = addClass // .getDeclaredConstructor(String.class); // Address address = addConstructor.newInstance("北京"); // System.out.println(address.addr); } } Constructor<Address> addConstructor = addClass .getDeclaredConstructor(int.class); 这样不可以吗 |
|
返回顶楼 | |