使用反射时出现IllegalAccessException

我试图学习反思,并且遇到了这个IllegalAccessException。请参见以下代码:

public class ReflectionTest

{

public static void main(String[] args)

{

Set<String> myStr = new HashSet<String>();

myStr.add("obj1");

Iterator itr = myStr.iterator();

Method mtd = itr.getClass().getMethod("hasNext");

System.out.println(m.invoke(it));

}

}

当我尝试运行该程序时,得到以下信息:

Exception in thread "main" IllegalAccessException

我不明白发生了什么。有任何想法吗?提前致谢。

回答:

您需要禁止Java语言访问检查,以便使用setAccessible(true)反射地调用另一个类中的私有方法:

Method mtd= itr.getClass().getMethod("hasNext");

if(!mtd.isAccessible()) {

mtd.setAccessible(true);

}

此外,启用SecurityManager后,我们需要额外的权限才能调用setAccessible(true)。否则,我们得到:

C:\ReflectionTest>java -Djava.security.manager CallFoo

Exception in thread "main" java.security.AccessControlException: access denied (java.lang.reflect.ReflectPermission suppressAccessChecks)

at java.security.AccessControlContext.checkPermission(AccessControlContext.java:264)

at java.security.AccessController.checkPermission(AccessController.java:427)

at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)

at java.lang.reflect.AccessibleObject.setAccessible(AccessibleObject.java:107)

at CallFoo.main(CallFoo.java:8)

我们只想向可信任的代码源(而不是对调用堆栈中的所有类)授予该excludeAccessChecks权限。因此,我们将修改CallFoo.java:

import java.lang.reflect.InvocationTargetException;

import java.lang.reflect.Method;

import java.security.AccessController;

import java.security.PrivilegedActionException;

import java.security.PrivilegedExceptionAction;

public class CallFoo {

public static void main(String args[]) throws Exception {

doCallFoo();

}

public static void doCallFoo() throws IllegalAccessException, ClassNotFoundException, NoSuchMethodException,

InvocationTargetException, InstantiationException, PrivilegedActionException {

Class fooClass = Class.forName("Foo");

final Foo foo = (Foo) fooClass.newInstance();

final Method helloMethod = fooClass.getDeclaredMethod("hello");

AccessController.doPrivileged(new PrivilegedExceptionAction() {

public Object run() throws Exception {

if(!helloMethod.isAccessible()) {

helloMethod.setAccessible(true);

}

helloMethod.invoke(foo);

return null;

}

});

}

}

以上是 使用反射时出现IllegalAccessException 的全部内容, 来源链接: utcz.com/qa/414878.html

回到顶部