Как мне использовать методы, загруженные из определенной банки с помощью javassist? - PullRequest
0 голосов
/ 05 ноября 2019

У меня есть образец 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);
    }
}}
...