java.lang.IllegalAccessException:类z.y.x.u.SimpleCompileTest无法使用修饰符“”访问类MyClass的成员

时间:2014-02-28 20:36:19

标签: java reflection

使用反射API时,我收到以下错误

java.lang.IllegalAccessException: Class z.y.x.u.SimpleCompileTest can not access a member of class MyClass with modifiers ""
    at sun.reflect.Reflection.ensureMemberAccess(Reflection.java:65)
    at java.lang.Class.newInstance0(Class.java:351)
    at java.lang.Class.newInstance(Class.java:310)
    at z.y.x.u.SimpleCompileTest.reflectionCall(SimpleCompileTest.java:44)
    at z.y.x.f.RunFunctionality.doPost(RunFunctionality.java:116)
    at z.y.x.f.RunFunctionality.doGet(RunFunctionality.java:53)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:620)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)

这是我的Psedu代码

public static void reflectionCall() {
        ClassLoader classLoader  =  SimpleCompileTest.class.getClassLoader();
        try{
             Class aClass = classLoader.loadClass("MyClass");

             Object t = aClass.newInstance();

             System.out.println("aClass.getName() = " + aClass.getName());
             Method  method = aClass.getDeclaredMethod ("myMethod", null);
             method.setAccessible(true);
             method.invoke(t, null);
.....
}

在发生以下错误时抛出错误

Object t = aClass.newInstance();

MyClass.class文件位于jar文件中,该文件在类路径中动态添加,而执行MyClass.java的内容为

public class MyClass {

    public MyClass() {
        // TODO Auto-generated constructor stub
    }

    public void myMethod(){
        System.out.println("My Method Called");
    }

}

无法弄清楚,问题是什么,任何帮助更多的赞赏。

2 个答案:

答案 0 :(得分:0)

异常消息是

java.lang.IllegalAccessException: Class z.y.x.u.SimpleCompileTest can not access a member of class MyClass with modifiers “”

请注意""内缺少修饰符值。 Class#newInstance()状态的javadoc

  

抛出:

     

IllegalAccessException - 如果无法访问该类或其无效构造函数

换句话说,您的MyClass构造函数无法访问。从您的代码看起来似乎是,但我猜你复制粘贴错了。它很可能缺少public修饰符,即。它具有默认的可访问性。由于该类和您的SimpleCompileTest类位于不同的包中,因此构造函数不可见。

答案 1 :(得分:0)

与 Spring Boot 有类似的问题,消息略有不同,但来自 @sotirios-delimanois 的解决方案有所帮助:

Class org.hibernate.proxy.pojo.bytebuddy.ByteBuddyInterceptor can not access a 
member of class com.etc.bla.model.entity.BackendBaseEntity with modifiers "public"

BackendBaseEntity 类确实具有包可见性,并使其 public 解决了错误。