从类自定义类加载器访问匿名类

时间:2014-01-22 21:29:16

标签: java reflection anonymous-class

我已经定义了一个类加载器,它应该从一个字节数组加载类,这是主类中的静态类。我想调用一个使用带有匿名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);
    }

}

我丢失了HelloHack source,但Thread是用

构建的
Thread t = new Thread(new Runnable() {
    public void run() {}
});

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

修改

我使用同一个Classloader的两个不同实例来加载对象。

private static final HelloHackClassLoader instance = new HelloHackClassLoader();

1 个答案:

答案 0 :(得分:0)

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;