Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从类自定义类装入器访问匿名类_Java_Reflection_Anonymous Class - Fatal编程技术网

Java 从类自定义类装入器访问匿名类

Java 从类自定义类装入器访问匿名类,java,reflection,anonymous-class,Java,Reflection,Anonymous Class,我定义了一个类加载器,它应该从字节数组加载类。这是主类中的一个静态类。我想调用一个使用匿名runnable线程的方法,但只得到一个错误 Exception in thread "main" java.lang.reflect.InvocationTargetException at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.

我定义了一个类加载器,它应该从字节数组加载类。这是主类中的一个静态类。我想调用一个使用匿名runnable线程的方法,但只得到一个错误

Exception in thread "main" java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at Hello.main(Hello.java:32)
Caused by: java.lang.IllegalAccessError: tried to access class HelloHack$1 from class HelloHack
    at HelloHack.hello(HelloHack.java:14)
    ... 5 more
我上的课是这样的:

public class Hello {

    private static class HelloHackClassLoader extends ClassLoader {
        private static final byte[] HelloHackData = {(byte)-54,(byte)-2,(byte)-70,(byte)-66,(byte)0,(byte)0,(byte)0,(byte)51,(byte)0,(byte)31,(byte)10,(byte)0,(byte)8,(byte)0,(byte)22,(byte)7,(byte)0,(byte)23,(byte)7,(byte)0,(byte)24,(byte)10,(byte)0,(byte)3,(byte)0,(byte)22,(byte)10,(byte)0,(byte)2,(byte)0,(byte)25,(byte)10,(byte)0,(byte)2,(byte)0,(byte)26,(byte)7,(byte)0,(byte)27,(byte)7,(byte)0,(byte)28,(byte)1,(byte)0,(byte)12,(byte)73,(byte)110,(byte)110,(byte)101,(byte)114,(byte)67,(byte)108,(byte)97,(byte)115,(byte)115,(byte)101,(byte)115,(byte)1,(byte)0,(byte)6,(byte)60,(byte)105,(byte)110,(byte)105,(byte)116,(byte)62,(byte)1,(byte)0,(byte)3,(byte)40,(byte)41,(byte)86,(byte)1,(byte)0,(byte)4,(byte)67,(byte)111,(byte)100,(byte)101,(byte)1,(byte)0,(byte)15,(byte)76,(byte)105,(byte)110,(byte)101,(byte)78,(byte)117,(byte)109,(byte)98,(byte)101,(byte)114,(byte)84,(byte)97,(byte)98,(byte)108,(byte)101,(byte)1,(byte)0,(byte)18,(byte)76,(byte)111,(byte)99,(byte)97,(byte)108,(byte)86,(byte)97,(byte)114,(byte)105,(byte)97,(byte)98,(byte)108,(byte)101,(byte)84,(byte)97,(byte)98,(byte)108,(byte)101,(byte)1,(byte)0,(byte)4,(byte)116,(byte)104,(byte)105,(byte)115,(byte)1,(byte)0,(byte)11,(byte)76,(byte)72,(byte)101,(byte)108,(byte)108,(byte)111,(byte)72,(byte)97,(byte)99,(byte)107,(byte)59,(byte)1,(byte)0,(byte)5,(byte)104,(byte)101,(byte)108,(byte)108,(byte)111,(byte)1,(byte)0,(byte)1,(byte)116,(byte)1,(byte)0,(byte)18,(byte)76,(byte)106,(byte)97,(byte)118,(byte)97,(byte)47,(byte)108,(byte)97,(byte)110,(byte)103,(byte)47,(byte)84,(byte)104,(byte)114,(byte)101,(byte)97,(byte)100,(byte)59,(byte)1,(byte)0,(byte)10,(byte)83,(byte)111,(byte)117,(byte)114,(byte)99,(byte)101,(byte)70,(byte)105,(byte)108,(byte)101,(byte)1,(byte)0,(byte)14,(byte)72,(byte)101,(byte)108,(byte)108,(byte)111,(byte)72,(byte)97,(byte)99,(byte)107,(byte)46,(byte)106,(byte)97,(byte)118,(byte)97,(byte)12,(byte)0,(byte)10,(byte)0,(byte)11,(byte)1,(byte)0,(byte)16,(byte)106,(byte)97,(byte)118,(byte)97,(byte)47,(byte)108,(byte)97,(byte)110,(byte)103,(byte)47,(byte)84,(byte)104,(byte)114,(byte)101,(byte)97,(byte)100,(byte)1,(byte)0,(byte)11,(byte)72,(byte)101,(byte)108,(byte)108,(byte)111,(byte)72,(byte)97,(byte)99,(byte)107,(byte)36,(byte)49,(byte)12,(byte)0,(byte)10,(byte)0,(byte)29,(byte)12,(byte)0,(byte)30,(byte)0,(byte)11,(byte)1,(byte)0,(byte)9,(byte)72,(byte)101,(byte)108,(byte)108,(byte)111,(byte)72,(byte)97,(byte)99,(byte)107,(byte)1,(byte)0,(byte)16,(byte)106,(byte)97,(byte)118,(byte)97,(byte)47,(byte)108,(byte)97,(byte)110,(byte)103,(byte)47,(byte)79,(byte)98,(byte)106,(byte)101,(byte)99,(byte)116,(byte)1,(byte)0,(byte)23,(byte)40,(byte)76,(byte)106,(byte)97,(byte)118,(byte)97,(byte)47,(byte)108,(byte)97,(byte)110,(byte)103,(byte)47,(byte)82,(byte)117,(byte)110,(byte)110,(byte)97,(byte)98,(byte)108,(byte)101,(byte)59,(byte)41,(byte)86,(byte)1,(byte)0,(byte)5,(byte)115,(byte)116,(byte)97,(byte)114,(byte)116,(byte)0,(byte)33,(byte)0,(byte)7,(byte)0,(byte)8,(byte)0,(byte)0,(byte)0,(byte)0,(byte)0,(byte)2,(byte)0,(byte)1,(byte)0,(byte)10,(byte)0,(byte)11,(byte)0,(byte)1,(byte)0,(byte)12,(byte)0,(byte)0,(byte)0,(byte)47,(byte)0,(byte)1,(byte)0,(byte)1,(byte)0,(byte)0,(byte)0,(byte)5,(byte)42,(byte)-73,(byte)0,(byte)1,(byte)-79,(byte)0,(byte)0,(byte)0,(byte)2,(byte)0,(byte)13,(byte)0,(byte)0,(byte)0,(byte)6,(byte)0,(byte)1,(byte)0,(byte)0,(byte)0,(byte)11,(byte)0,(byte)14,(byte)0,(byte)0,(byte)0,(byte)12,(byte)0,(byte)1,(byte)0,(byte)0,(byte)0,(byte)5,(byte)0,(byte)15,(byte)0,(byte)16,(byte)0,(byte)0,(byte)0,(byte)9,(byte)0,(byte)17,(byte)0,(byte)11,(byte)0,(byte)1,(byte)0,(byte)12,(byte)0,(byte)0,(byte)0,(byte)70,(byte)0,(byte)4,(byte)0,(byte)1,(byte)0,(byte)0,(byte)0,(byte)20,(byte)-69,(byte)0,(byte)2,(byte)89,(byte)-69,(byte)0,(byte)3,(byte)89,(byte)-73,(byte)0,(byte)4,(byte)-73,(byte)0,(byte)5,(byte)75,(byte)42,(byte)-74,(byte)0,(byte)6,(byte)-79,(byte)0,(byte)0,(byte)0,(byte)2,(byte)0,(byte)13,(byte)0,(byte)0,(byte)0,(byte)14,(byte)0,(byte)3,(byte)0,(byte)0,(byte)0,(byte)14,(byte)0,(byte)15,(byte)0,(byte)19,(byte)0,(byte)19,(byte)0,(byte)20,(byte)0,(byte)14,(byte)0,(byte)0,(byte)0,(byte)12,(byte)0,(byte)1,(byte)0,(byte)15,(byte)0,(byte)5,(byte)0,(byte)18,(byte)0,(byte)19,(byte)0,(byte)0,(byte)0,(byte)2,(byte)0,(byte)20,(byte)0,(byte)0,(byte)0,(byte)2,(byte)0,(byte)21,(byte)0,(byte)9,(byte)0,(byte)0,(byte)0,(byte)10,(byte)0,(byte)1,(byte)0,(byte)3,(byte)0,(byte)0,(byte)0,(byte)0,(byte)0,(byte)8};
        private static final Class HelloHack = new HelloHackClassLoader().defineClass("HelloHack", HelloHackData, 0, HelloHackData.length);
        private static final byte[] HelloHack1Data = {(byte)-54,(byte)-2,(byte)-70,(byte)-66,(byte)0,(byte)0,(byte)0,(byte)51,(byte)0,(byte)39,(byte)10,(byte)0,(byte)6,(byte)0,(byte)22,(byte)9,(byte)0,(byte)23,(byte)0,(byte)24,(byte)8,(byte)0,(byte)25,(byte)10,(byte)0,(byte)26,(byte)0,(byte)27,(byte)7,(byte)0,(byte)28,(byte)7,(byte)0,(byte)29,(byte)7,(byte)0,(byte)30,(byte)1,(byte)0,(byte)6,(byte)60,(byte)105,(byte)110,(byte)105,(byte)116,(byte)62,(byte)1,(byte)0,(byte)3,(byte)40,(byte)41,(byte)86,(byte)1,(byte)0,(byte)4,(byte)67,(byte)111,(byte)100,(byte)101,(byte)1,(byte)0,(byte)15,(byte)76,(byte)105,(byte)110,(byte)101,(byte)78,(byte)117,(byte)109,(byte)98,(byte)101,(byte)114,(byte)84,(byte)97,(byte)98,(byte)108,(byte)101,(byte)1,(byte)0,(byte)18,(byte)76,(byte)111,(byte)99,(byte)97,(byte)108,(byte)86,(byte)97,(byte)114,(byte)105,(byte)97,(byte)98,(byte)108,(byte)101,(byte)84,(byte)97,(byte)98,(byte)108,(byte)101,(byte)1,(byte)0,(byte)4,(byte)116,(byte)104,(byte)105,(byte)115,(byte)1,(byte)0,(byte)12,(byte)73,(byte)110,(byte)110,(byte)101,(byte)114,(byte)67,(byte)108,(byte)97,(byte)115,(byte)115,(byte)101,(byte)115,(byte)1,(byte)0,(byte)13,(byte)76,(byte)72,(byte)101,(byte)108,(byte)108,(byte)111,(byte)72,(byte)97,(byte)99,(byte)107,(byte)36,(byte)49,(byte)59,(byte)1,(byte)0,(byte)3,(byte)114,(byte)117,(byte)110,(byte)1,(byte)0,(byte)10,(byte)83,(byte)111,(byte)117,(byte)114,(byte)99,(byte)101,(byte)70,(byte)105,(byte)108,(byte)101,(byte)1,(byte)0,(byte)14,(byte)72,(byte)101,(byte)108,(byte)108,(byte)111,(byte)72,(byte)97,(byte)99,(byte)107,(byte)46,(byte)106,(byte)97,(byte)118,(byte)97,(byte)1,(byte)0,(byte)15,(byte)69,(byte)110,(byte)99,(byte)108,(byte)111,(byte)115,(byte)105,(byte)110,(byte)103,(byte)77,(byte)101,(byte)116,(byte)104,(byte)111,(byte)100,(byte)7,(byte)0,(byte)31,(byte)12,(byte)0,(byte)32,(byte)0,(byte)9,(byte)12,(byte)0,(byte)8,(byte)0,(byte)9,(byte)7,(byte)0,(byte)33,(byte)12,(byte)0,(byte)34,(byte)0,(byte)35,(byte)1,(byte)0,(byte)5,(byte)72,(byte)101,(byte)108,(byte)108,(byte)111,(byte)7,(byte)0,(byte)36,(byte)12,(byte)0,(byte)37,(byte)0,(byte)38,(byte)1,(byte)0,(byte)11,(byte)72,(byte)101,(byte)108,(byte)108,(byte)111,(byte)72,(byte)97,(byte)99,(byte)107,(byte)36,(byte)49,(byte)1,(byte)0,(byte)16,(byte)106,(byte)97,(byte)118,(byte)97,(byte)47,(byte)108,(byte)97,(byte)110,(byte)103,(byte)47,(byte)79,(byte)98,(byte)106,(byte)101,(byte)99,(byte)116,(byte)1,(byte)0,(byte)18,(byte)106,(byte)97,(byte)118,(byte)97,(byte)47,(byte)108,(byte)97,(byte)110,(byte)103,(byte)47,(byte)82,(byte)117,(byte)110,(byte)110,(byte)97,(byte)98,(byte)108,(byte)101,(byte)1,(byte)0,(byte)9,(byte)72,(byte)101,(byte)108,(byte)108,(byte)111,(byte)72,(byte)97,(byte)99,(byte)107,(byte)1,(byte)0,(byte)5,(byte)104,(byte)101,(byte)108,(byte)108,(byte)111,(byte)1,(byte)0,(byte)16,(byte)106,(byte)97,(byte)118,(byte)97,(byte)47,(byte)108,(byte)97,(byte)110,(byte)103,(byte)47,(byte)83,(byte)121,(byte)115,(byte)116,(byte)101,(byte)109,(byte)1,(byte)0,(byte)3,(byte)111,(byte)117,(byte)116,(byte)1,(byte)0,(byte)21,(byte)76,(byte)106,(byte)97,(byte)118,(byte)97,(byte)47,(byte)105,(byte)111,(byte)47,(byte)80,(byte)114,(byte)105,(byte)110,(byte)116,(byte)83,(byte)116,(byte)114,(byte)101,(byte)97,(byte)109,(byte)59,(byte)1,(byte)0,(byte)19,(byte)106,(byte)97,(byte)118,(byte)97,(byte)47,(byte)105,(byte)111,(byte)47,(byte)80,(byte)114,(byte)105,(byte)110,(byte)116,(byte)83,(byte)116,(byte)114,(byte)101,(byte)97,(byte)109,(byte)1,(byte)0,(byte)7,(byte)112,(byte)114,(byte)105,(byte)110,(byte)116,(byte)108,(byte)110,(byte)1,(byte)0,(byte)21,(byte)40,(byte)76,(byte)106,(byte)97,(byte)118,(byte)97,(byte)47,(byte)108,(byte)97,(byte)110,(byte)103,(byte)47,(byte)83,(byte)116,(byte)114,(byte)105,(byte)110,(byte)103,(byte)59,(byte)41,(byte)86,(byte)0,(byte)48,(byte)0,(byte)5,(byte)0,(byte)6,(byte)0,(byte)1,(byte)0,(byte)7,(byte)0,(byte)0,(byte)0,(byte)2,(byte)0,(byte)0,(byte)0,(byte)8,(byte)0,(byte)9,(byte)0,(byte)1,(byte)0,(byte)10,(byte)0,(byte)0,(byte)0,(byte)47,(byte)0,(byte)1,(byte)0,(byte)1,(byte)0,(byte)0,(byte)0,(byte)5,(byte)42,(byte)-73,(byte)0,(byte)1,(byte)-79,(byte)0,(byte)0,(byte)0,(byte)2,(byte)0,(byte)11,(byte)0,(byte)0,(byte)0,(byte)6,(byte)0,(byte)1,(byte)0,(byte)0,(byte)0,(byte)14,(byte)0,(byte)12,(byte)0,(byte)0,(byte)0,(byte)12,(byte)0,(byte)1,(byte)0,(byte)0,(byte)0,(byte)5,(byte)0,(byte)13,(byte)0,(byte)15,(byte)0,(byte)0,(byte)0,(byte)1,(byte)0,(byte)16,(byte)0,(byte)9,(byte)0,(byte)1,(byte)0,(byte)10,(byte)0,(byte)0,(byte)0,(byte)55,(byte)0,(byte)2,(byte)0,(byte)1,(byte)0,(byte)0,(byte)0,(byte)9,(byte)-78,(byte)0,(byte)2,(byte)18,(byte)3,(byte)-74,(byte)0,(byte)4,(byte)-79,(byte)0,(byte)0,(byte)0,(byte)2,(byte)0,(byte)11,(byte)0,(byte)0,(byte)0,(byte)10,(byte)0,(byte)2,(byte)0,(byte)0,(byte)0,(byte)16,(byte)0,(byte)8,(byte)0,(byte)17,(byte)0,(byte)12,(byte)0,(byte)0,(byte)0,(byte)12,(byte)0,(byte)1,(byte)0,(byte)0,(byte)0,(byte)9,(byte)0,(byte)13,(byte)0,(byte)15,(byte)0,(byte)0,(byte)0,(byte)3,(byte)0,(byte)17,(byte)0,(byte)0,(byte)0,(byte)2,(byte)0,(byte)18,(byte)0,(byte)19,(byte)0,(byte)0,(byte)0,(byte)4,(byte)0,(byte)20,(byte)0,(byte)21,(byte)0,(byte)14,(byte)0,(byte)0,(byte)0,(byte)10,(byte)0,(byte)1,(byte)0,(byte)5,(byte)0,(byte)0,(byte)0,(byte)0,(byte)0,(byte)8};
        private static final Class HelloHack1 = new HelloHackClassLoader().defineClass("HelloHack$1", HelloHack1Data, 0, HelloHack1Data.length);
        public Class<?> findClass(String name) {
            for(Field f:getClass().getDeclaredFields()) {
                if(name.equals("HelloHack$1")) return HelloHack1;
            }
            return null;
        }
    }
    public static final Class HelloHack = HelloHackClassLoader.HelloHack;

    public static void main(String args[]) throws NoSuchMethodException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
        HelloHack.getDeclaredMethod("hello").invoke(null);
    }

}
我不知道为什么会这样。我用相同的类加载器加载了这两个类

编辑 我使用同一类加载器的两个不同实例来加载对象

private static final HelloHackClassLoader instance = new HelloHackClassLoader();

HelloHack$1似乎是从另一个类加载器加载的,此代码不必要地使事情复杂化:

 for(Field f:getClass().getDeclaredFields()) {
                if(name.equals("HelloHack$1")) return HelloHack1;
            }
            return null;
        }
你为什么不写下:

            if(name.equals("HelloHack$1")) return HelloHack1;
            if(name.equals("HelloHack")) return HelloHack;
        return null;

你能检查一下HelloHack1.class.getClassLoader()=HelloHack.class.getClassLoader()吗;只需创建一个自定义类加载器实例,并使用它来加载这两个类,我认为这就是问题所在。
            if(name.equals("HelloHack$1")) return HelloHack1;
            if(name.equals("HelloHack")) return HelloHack;
        return null;