Tag: metaprogramming

Java静态元编程

我想实现一个基于现有“prototype”类生成新类的注释处理器。 import java.util.List @MyAnnotation class MySuperClassPrototype { static MySuperClassPrototype createInstance() { return new MySuperClassPrototype(); } } 由于下面的代码。 将生成以下新源文件(编译单元): import java.util.List class MySuperClass { static MySuperClass createInstance() { return new MySuperClass(); } public void specialAddedMethod() { /*…*/ } } 我想复制所有顶级import语句和静态成员,而不是原型类的静态成员。 我用Compiler Tree API(com.sun.source.tree)移动了很多。 我可以打印出Tree数据类型,同时用new class name替换old。 但是有些问题似乎很难。 如果我在树中获得Tree.Kind.IDENTIFIER,我如何找到它引用的实际类。 我需要用MySuperClass标识符替换所有出现的MySuperClassPrototype标识符,然后打印出整个树。 这可行吗? 类似地,我需要过滤掉@MyAnnotation注释,然后再用Tree.Kind.IDENTIFIER或Tree.Kind.MEMBER_SELECT表示。 如何找到此标识符引用的实际注释类? 另一个问题是打印树。 如果我使用toString方法,我得到了不错的结果,但是构造函数被打印为具有“”名称的方法而不是与其类同名的方法,因此我需要手动打印每种树节点。 你可以看到我在这里附带的代码

显式使用LambdaMetafactory

我正在尝试显式使用LambdaMetafactory.metafactory,我无法理解为什么它仅适用于Runnablefunction接口。 例如,此代码执行预期的操作(它打印“hello world”): public class MetafactoryTest { public static void main(String[] args) throws Throwable { MethodHandles.Lookup caller = MethodHandles.lookup(); MethodType methodType = MethodType.methodType(void.class); MethodType invokedType = MethodType.methodType(Runnable.class); CallSite site = LambdaMetafactory.metafactory(caller, “run”, invokedType, methodType, caller.findStatic(MetafactoryTest.class, “print”, methodType), methodType); MethodHandle factory = site.getTarget(); Runnable r = (Runnable) factory.invoke(); r.run(); } private static void print() { System.out.println(“hello […]

您是否可以使用Groovy元编程来覆盖Java类上的私有方法

我正在尝试使用元编程覆盖Java类上的私有方法。 代码看起来像这样: // Java class public class MyClass{ private ClassOfSomeSort property1; private ClassOfSomeOtherSort property2; public void init(){ property1 = new ClassOfSomeSort(); property2 = new ClassOfSomeOtherSort(); doSomethingCrazyExpensive(); } private void doSomethingCrazyExpensive(){ System.out.println(“I’m doing something crazy expensive”); } } // Groovy class public class MyClassTest extends Specification{ def “MyClass instance gets initialised correctly”(){ given: ExpandoMetaClass emc = […]