A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 广驰 中级黑马   /  2012-9-21 13:25  /  1396 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 应广驰 于 2012-9-21 13:47 编辑

使用反射可以直接调用很多东西,比如修改私有变量、跳过泛型限定,虽然反射有时候会很方便,这样不就违背了java安全的本质和思想了吗,那么要怎样去处理这些问题呢。
  1. Collection<String> collection = new ArrayList<String>();
  2.                 collection.add("3");
  3.                 collection.add("sdfa");
  4.                 System.out.println(collection);
  5.                
  6.                 Method method = java.util.ArrayList.class.getMethod("add",Object.class);
  7.                 method.invoke(collection, new int[]{132,34,54});
  8.                 System.out.println(collection);
复制代码
比如像这样,我定义的是限定了String类型,但是反射的确实整型数组都可以

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 很有思考的问题

查看全部评分

5 个回复

倒序浏览
私有的成员变量都可以调用,叫暴力反射。。。
回复 使用道具 举报
Java编程语言定义一种多级别方法来处理反射的安全性。基本模式是对反射实施与应用于源代码接入相同的限制:

n          从任意位置到类公共组件的接入

n          类自身外部无任何到私有组件的接入

n          受保护和打包(缺省接入)组件的有限接入

不过至少有些时候,围绕这些限制还有一种简单的方法。我们可以在我们所写的类中,扩展一个普通的基本类java.lang.reflect.AccessibleObject 类。这个类定义了一种setAccessible方法,使我们能够启动或关闭对这些类中其中一个类的实例的接入检测。唯一的问题在于如果使用了安全性管理器,它将检测正在关闭接入检测的代码是否许可了这样做。如果未许可,安全性管理器抛出一个例外。

下面是一段程序,在TwoString 类的一个实例上使用反射来显示安全性正在运行:

public class ReflectSecurity {

     public static void main(String[] args) {

         try {

             TwoString ts = new TwoString("a", "b");

             Field field = clas.getDeclaredField("m_s1");

//           field.setAccessible(true);

             System.out.println("Retrieved value is " +

                 field.get(inst));

         } catch (Exception ex) {

             ex.printStackTrace(System.out);

         }

     }

}

如果编译这一程序时,不使用任何特定参数直接从命令行运行,它将在field .get(inst)调用中抛出一个IllegalAccessException异常。如果我们不注释field.setAccessible(true)代码行,那么重新编译并重新运行该代码,它将编译成功。最后,如果我们在命令行添加了JVM参数-Djava.security.manager以实现安全性管理器,它仍然将不能通过编译,除非我们定义了ReflectSecurity类的许可权限。

希望对你有帮助.

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

回复 使用道具 举报
刘进朝 发表于 2012-9-21 13:40
Java编程语言定义一种多级别方法来处理反射的安全性。基本模式是对反射实施与应用于源代码接入相同的限制: ...

也就是用异常机制来保证它的安全吗??
回复 使用道具 举报
可以那么理解.
回复 使用道具 举报
刘进朝 发表于 2012-9-21 14:34
可以那么理解.

那像我上面的代码那样操作集合呢,没有异常啊,这样使用的时候不久会出错么
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马