通过Groovy脚本访问Java的局部变量

问题描述 投票:0回答:1

通过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脚本打印。

尝试过很多方法,但也没有发现任何

java groovy
1个回答
1
投票

简短的回答:Groovy中无法做到这一点。

更长的答案:到底的Groovy取决于什么JVM和思考做报价。这是故意实际上不包括的功能,这需要字节码像元编程“正常”常规逻辑的转变。局部变量只存在“缝隙”,可能在方法字节码的名称。因此,你需要为已经在这里提到的字节码操作库。

© www.soinside.com 2019 - 2024. All rights reserved.