}
}
安全性和反射:
在处理反射时安全性是一个较复杂的问题 。反射经常由框架型代码使用 , 由于这一点,我们可能希望框架能够全面接入代码,无需考虑常规的接入限制 。但是,在其它情况下,不受控制的接入会带来严重的安全性风险 , 例如当代码在不值得信任的代码共享的环境中运行时 。
由于这些互相矛盾的需求,Java编程语言定义一种多级别方法来处理反射的安全性 。基本模式是对反射实施与应用于源代码接入相同的限制:
从任意位置到类公共组件的接入
类自身外部无任何到私有组件的接入
受保护和打包(缺省接入)组件的有限接入
不过至少有些时候 , 围绕这些限制还有一种简单的方法 。我们可以在我们所写的类中 , 扩展一个普通的基本类 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类的许可权 限 。
反射性能:(转录别人的?。?
反射是一种强大的工具,但也存在一些不足 。一个主要的缺点是对性能有影响 。使用反射基本上是一种解释操作,我们可以告诉JVM,我们希望做什么并且它满足我们的要求 。这类操作总是慢于只直接执行相同的操作 。
下面的程序是字段接入性能测试的一个例子 , 包括基本的测试方法 。每种方法测试字段接入的一种形式 -- accessSame 与同一对象的成员字段协作,accessOther 使用可直接接入的另一对象的字段,accessReflection 使用可通过反射接入的另一对象的字段 。在每种情况下,方法执行相同的计算 -- 循环中简单的加/乘顺序 。
程序如下:
public int accessSame(int loops) {
m_value = https://www.04ip.com/post/0;
for (int index = 0; indexloops; index++) {
m_value = https://www.04ip.com/post/(m_value + ADDITIVE_VALUE) *
MULTIPLIER_VALUE;
}
return m_value;
}
public int acces
sReference(int loops) {
TimingClass timing = new TimingClass();
for (int index = 0; indexloops; index++) {
timing.m_value = https://www.04ip.com/post/(timing.m_value + ADDITIVE_VALUE) *
MULTIPLIER_VALUE;
}
return timing.m_value;
}
public int accessReflection(int loops) throws Exception {
TimingClass timing = new TimingClass();
try {
Field field = TimingClass.class.
getDeclaredField("m_value");
for (int index = 0; indexloops; index++) {
int value = https://www.04ip.com/post/(field.getInt(timing) +
- mysql数据库优化 mysql订单优化
- 使用redis实现分布式锁及其优化 redis分布式性能
- java查询数组中是否包含某一个值 javamongodb数组查询
- mongodb聚合查询优化 mongodb聚合运算需要索引吗
- redis实战电子书 redisjava书籍
- mysql分页性能优化 mysql分页执行很慢
- javaredis集群 javaredis列队
- mysql分页有什么优化 mysql分页功能
- mysql分区表优劣分析 分区优化大数据mysql
- Redis队列排队 redis队列java
