Groovy/Java: внедрение метода в классе JDK не видно из Java

Я пытаюсь внедрить код в класс JDK, Integer, Инъекция работает до тех пор, пока я остаюсь в Groovy, но не работает, если я пытаюсь использовать внедренный код из клиента Java.

Вот демонстрация проблемы.

Следующий Groovy код...

// File: g.groovy
class G {
    public static void init() {
        println 'Constructor injected';
        java.lang.Integer.metaClass.constructor = { i -> 
            println "My constructor called for Integer($i)"
            def constructor = Integer.class.getConstructor(int.class)
            constructor.newInstance(i)
        }
    }

    public static void main(String[] args) {
        G.init();
    }
}

println 'Before injection'
new Integer(1);

G.init()

new Integer(1);

... дает мне правильный вывод:

$ groovy g.groovy
Before injection
Constructor injected
My constructor called for Integer(1)
$

Теперь я удаляю все из g.groovy КРОМЕ для class G:

// File: g.groovy
class G {
    public static void init() {
        println 'Constructor injected';
        java.lang.Integer.metaClass.constructor = { i -> 
            println "My constructor called for Integer($i)"
            def constructor = Integer.class.getConstructor(int.class)
            constructor.newInstance(i)
        }
    }

    public static void main(String[] args) {
        G.init();
    }
}

Затем я собираю g.groovy:

$ groovyc g.groovy
$ ls *.class
G.class  G$_init_closure1.class
$

Затем я пытаюсь использовать инъекцию из U.java:

// U.java
public class U {
    public static void main(String[] args) {
        System.out.println("Creating a new integer");
        new Integer(1);

        G.init();

        System.out.println("Creating a new integer");
        new Integer(1);
    }
}

И результат, который я получаю, таков:

$ javac U.java
$ java -cp .:/path/to/groovy/embeddable/groovy-all-2.1.7.jar U
Creating a new integer
Constructor injected
Creating a new integer
$

Впрыск явно не сработал!

1 ответ

Java не имеет понятия метакласса, так что это не будет работать со стороны Java, как вы видели

Другие вопросы по тегам