У меня есть образец jar, который я загружаю в пул классов с диска. Оттуда я могу легко получить доступ к методам внутри этого класса и применить их, как вы можете видеть, что я делал с помощью метода JsEval.
Однако внутри сэмпла класса Helloworld я бы хотел иметь возможность инструментализировать другиевызовы библиотечных функций. В этом примере я пытаюсь применить функцию eval из скриптового движка nashorn. Однако это не работает. Я в состоянии получить доступ к классу (pool.get) просто отлично, и я могу исправлять методы для eval. Но когда я запускаю SampleClass из cl.run (), методы выполняются, как будто не было вставлено никакого кода. Я подозреваю, что это как-то связано с загрузчиком классов, который я использую для выполнения Sampleclass, но я застрял. Любые идеи о том, что я делаю здесь не так?
public class maventest {
public static void main(String[] args) throws NotFoundException, CannotCompileException, Throwable {
ClassPool pool = ClassPool.getDefault();
Loader cl = new Loader(pool);
//pool.importPackage(Test.class.getPackage().getName());
//This works and the method is instrumented.
pool.insertClassPath("Z:\\HelloWorld\\target\\HelloWorld-1.0-SNAPSHOT-jar-with-dependencies.jar"); //Get the Jar from disk.
pool.importPackage("com.mycompany.helloworld");
//pool.appendClassPath();
CtClass helloworld = pool.get("com.mycompany.helloworld.SampleClass");
helloworld.getDeclaredMethod("JsEval").insertBefore("System.out.println(\"Calling JsEval from within helloworld\\n\");");
//This does not work.
//Attempt to instrument the eval function that is called from inside of HelloWorld
String classToLoad = "jdk.nashorn.api.scripting.NashornScriptEngine";
String constuctor_name = "eval";
CtClass nash = pool.get(classToLoad);
//Multiple eval calls.. Just instrument them all.
CtMethod[] meths = nash.getDeclaredMethods("eval");
for (CtMethod m : meths) {
m.insertBefore("System.out.println(\"Nashorn Scripting Engined eval called.\");");
}
//Execute the hello world class with null args
cl.run("com.mycompany.helloworld.SampleClass", null);
}}
Вот пример кода, который вызывает функции lib, которые я хочу использовать.
public class SampleClass {
public static void main(String[] args) throws IOException, NotFoundException {
JsEval("var greeting='hello world'; print(greeting) + greeting");
}
private static void JsEval(String js) {
ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
try {
Object result = engine.eval(js);
} catch (ScriptException ex) {
Logger.getLogger(SampleClass.class.getName()).log(Level.SEVERE, null, ex);
}
}}