Доступ к локальной переменной Java через скрипт Groovy - PullRequest
0 голосов
/ 04 февраля 2019

С помощью скрипта 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.

Пробовал много способов, но не смог найти

1 Ответ

0 голосов
/ 05 февраля 2019

Краткий ответ: Groovy не может этого сделать.

Более длинный ответ: В конце концов, Groovy зависит от того, что предлагают JVM и Reflection.На самом деле это было сделано специально для того, чтобы не включать функции, которые требуют преобразования байт-кода для «нормальной» Groovy-логики, такой как метапрограммирование.Локальные переменные существуют только как «слоты», которые могут иметь имя в байт-коде методов.Таким образом, вам потребуется библиотека манипулирования байт-кодом, как уже упоминалось здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...