我发现问题,我应该只使用一个简单的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');