通过groovy脚本访问java局部变量

jfgube3f  于 2021-07-09  发布在  Java
关注(0)|答案(1)|浏览(455)

通过groovy脚本(元编程),我可以访问和修改在java类中全局声明的变量。甚至我也可以使用脚本调用或重写java方法。但是我找不到任何方法来访问类的特定方法中的变量。
考虑一个类methodinjection.java

public class MethodInjection {

static String text = "";

public static void main(String[] args) throws Exception 
{
    Execute();        
}

public static void Execute() throws IOException 
{
    System.out.println("Before Value : "+text);        
    String script = loadScript("Path_to_script");
    Script scripting = new GroovyShell().parse(script);
    scripting.run();
}

public static void print()
{
    System.out.println("After Value : "+text); 
}

public static void access()
{
    String local ="";
}

static String loadScript(String fileName) throws IOException 
{
    BufferedReader br = new BufferedReader(new FileReader(fileName));
    try 
    {
        StringBuilder sb = new StringBuilder();
        String line = br.readLine();

        while (line != null) 
        {
            sb.append(line);
            sb.append("\n");
            line = br.readLine();
        }
        return sb.toString();
    } 
    finally 
    {
        br.close();
    }
}}

同样的剧本是:

import methodinjection.MethodInjection

def access = new MethodInjection()
access.text = "Modified"
access.metaClass.access.local = "change"
access.print()
println access.metaClass.access.local

我得到的结果是

Before Value : 
After Value : Modified
groovy.lang.ExpandoMetaClass$ExpandoMetaProperty@75f9ecc

但我需要修改局部变量并通过groovy脚本打印它。
试了很多方法,但都找不到

bvjveswy

bvjveswy1#

简而言之:groovy无法做到这一点。
长话短说:groovy最终取决于jvm和反射提供了什么。它实际上是有意不包含特性,这些特性需要对字节码进行转换,以实现“普通”groovy逻辑(如元编程)。局部变量只以“slot”的形式存在,在方法字节码中可能有一个名称。因此,您需要一个字节码操作库,正如这里已经提到的。

相关问题