accessible
java反射机制提供的setaccessible()方法可以取消Java的权限控制检查,下面展示了这种方法的使用。
package test;
import java.lang.reflect.field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
class A {
private int i = 5;
private void printI() {
System.out.println(this.i);
}
}
public class Test {
public static void main(String[] args)
throws ClassnotfoundException, instantiationexception, IllegalAccessException, NoSuchFieldException, SecurityException, NoSuchMethodException, illegalargumentException, InvocationTargetException {
String name = "test.A";
Class c = class.forname(name);
Object obj = c.newinstance();
Method method = c.getDeclaredMethod("printI");
//使private方法可以被调用
method.setAccessible(true);
method.invoke(obj);
Field field = c.getDeclaredField("i");
//使private成员可以被访问、修改
field.setAccessible(true);
field.set(obj, 10);
method.invoke(obj);
}
}
运行结果:
5
10
上述例子中,setAccessible(true)取消了Java的权限控制检查(注意不是改变方法或字段的访问权限),调用了类A的private方法,并且修改了其private成员变量的值。
而对于setAccessible()方法是否会破坏类的访问规则,产生安全隐患,我在知乎上面看到的一篇回答貌似很有道理:
另外,我们可以启用java.security.manager来判断程序是否具有调用setAccessible()的权限。默认情况下,内核API和扩展目录的代码具有该权限,而类路径或通过URLClassLoader加载的应用程序不拥有此权限。例如,当我通过cmd编译上述程序时就会报错:
相关阅读
恋吧在以前的博文中分别介绍了基于ASP和PHP的开源CMS程序一览,今天为网友献上18个Java开源CMS系统大餐,以飨网友厚爱。1.InfoGluein
java使用 zipoutputstream 进行解压缩时提示:不可预料
private static void zip(File filein, String basepath, ZipOutputStream out) throws IOException { FileInputStream in = n
java.lang.Enum.ordinal() 方法返回枚举常量的序数(它在枚举声明,其中初始常量分配的零序位)。【实例】package com.yiibai; impo
当使用继承这个特性时,程序是如何执行的;继承的初始化顺序1.初始化父类再初始子类2.先执行初始化对象中属性,再执行构造方法中的初始
java获取获得Timestamp类型的当前系统时间。方法1: Timestampd = newTimestamp(System.currentTimeMillis()); 方法2: Datedate