论坛首页 Java企业应用论坛

使用反射是否破坏了程序的封装性

浏览 19867 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (3)
作者 正文
   发表时间:2011-09-24  
jacky1118sally 写道
防君子 不防小人嘛
这个 也无可厚非

正解!
0 请登录后投票
   发表时间:2011-09-24  
反射主要会破坏程序的封装性,但它主要是供工具构造者使用,应用开发中应用较少。
0 请登录后投票
   发表时间: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
0 请登录后投票
   发表时间:2011-09-24  
学习了,反射机制
0 请登录后投票
   发表时间:2011-09-24  
我也觉得这个问题本身就问得有问题,通过反射能执行private方法吗,大家有没有测试过啊,我测试过好像是不行的。
0 请登录后投票
   发表时间:2011-09-24  
来好意思,是我没见识,java还真提供了这么种操作private的方法,以前还真没见过。不过就算是这样,有何破坏不破坏,封装讲得是主流,不是每个地方都必须要这样做,特殊的地方还是得特殊处理,不要死搬概念,
0 请登录后投票
   发表时间:2011-09-24  
反射的效率是不是比创建对象然后调用,损耗要大?
0 请登录后投票
   发表时间: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());
    }
}

0 请登录后投票
   发表时间: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);
}
}


说的就是你,难道没有感觉到我的问题中提到的就是你吗?
0 请登录后投票
   发表时间: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);  这样不可以吗
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics