从一些类加载器加载的jar中使用的javassist

时间:2015-11-11 21:56:37

标签: java classloader javassist

我发现问题,我应该只使用一个简单的final ClassPool pool = ClassPool.getDefault(); pool.importPackage(Test.class.getPackage().getName()); pool.appendClassPath(new LoaderClassPath(this.getClass().getClassLoader())); pool.appendClassPath(new LoaderClassPath(Test.class.getClassLoader())); pool.appendClassPath(new ClassClassPath(Test.class)); final CtClass newClass = pool.makeClass("TeeestClass"); newClass.addInterface(pool.get(ObjectEvaluator.class.getName())); // line of error: newClass.addMethod(CtNewMethod.make(pool.get(Object.class.getName()), "eval", new CtClass[0], new CtClass[]{pool.get(Exception.class.getName())}, "{return new Test();}", newClass)); final Class<?> clazz = newClass.toClass(Test.class.getClassLoader()); //final Class<?> clazz = newClass.toClass(this.getClass().getClassLoader()); //final Class<?> clazz = newClass.toClass(this.getClass().getClassLoader(), this.getClass().getProtectionDomain()); final ObjectEvaluator obj = (ObjectEvaluator) clazz.newInstance(); System.out.println(obj.eval()); 而不是追加,但它仍然非常错,因为它能够找到我的类,但在使用追加时不能使用它。

我正在为某些Java应用程序创建插件/插件,使用自己的类加载器从每个插件加载它们(每个插件都有自己的类加载器)

我想在这里使用javassist,但我不能创建实现我的界面并使用我的类的新类。

代码:

Test

其中toString是我的简单类,具有重写的ObjectEvaluator方法,Object eval()是与appendClassPath方法的简单接口。

(多个java.lang.RuntimeException: javassist.NotFoundException: myapp.Test at javassist.CtClassType.getClassFile2(CtClassType.java:208) at javassist.compiler.MemberResolver.lookupMethod(MemberResolver.java:99) at javassist.compiler.MemberResolver.lookupMethod(MemberResolver.java:85) at javassist.compiler.TypeChecker.atMethodCallCore(TypeChecker.java:738) at javassist.compiler.TypeChecker.atNewExpr(TypeChecker.java:149) at javassist.compiler.ast.NewExpr.accept(NewExpr.java:73) at javassist.compiler.CodeGen.doTypeCheck(CodeGen.java:242) at javassist.compiler.CodeGen.compileExpr(CodeGen.java:229) at javassist.compiler.CodeGen.atReturnStmnt2(CodeGen.java:615) at javassist.compiler.JvstCodeGen.atReturnStmnt(JvstCodeGen.java:425) at javassist.compiler.CodeGen.atStmnt(CodeGen.java:363) at javassist.compiler.ast.Stmnt.accept(Stmnt.java:50) at javassist.compiler.CodeGen.atStmnt(CodeGen.java:351) at javassist.compiler.ast.Stmnt.accept(Stmnt.java:50) at javassist.compiler.CodeGen.atMethodBody(CodeGen.java:292) at javassist.compiler.Javac.compileBody(Javac.java:223) at javassist.CtBehavior.setBody(CtBehavior.java:438) at javassist.CtBehavior.setBody(CtBehavior.java:412) at javassist.CtNewMethod.make(CtNewMethod.java:138) at javassist.CtNewMethod.make(CtNewMethod.java:106) at myapp.Main.run(Main.java:60) 用于测试/尝试使其正常工作)

$arr = array('10', '12');

0 个答案:

没有答案