什么是反思,为什么它有用?
我对Java特别感兴趣,但我认为在任何语言中原则都是一样的.
静态元编程(又名"模板元编程")是一种很棒的C++技术,它允许在编译时执行程序.一读到这个规范的元编程示例,一个灯泡在我脑海中消失了:
#include <iostream>
using namespace std;
template< int n >
struct factorial { enum { ret = factorial< n - 1 >::ret * n }; };
template<>
struct factorial< 0 > { enum { ret = 1 }; };
int main() {
cout << "7! = " << factorial< 7 >::ret << endl; // 5040
return 0;
}
Run Code Online (Sandbox Code Playgroud)
如果想要了解更多关于C++静态元编程的知识,那么最好的来源是什么(书籍,网站,在线课件,等等)?
我正在阅读关于Java平台上ployglot编程的 TheServerSide上的一篇文章.文章中的一些评论将元编程称为生成代码的能力(可能即时).
元编程能否动态生成代码,或者是在运行时将方法和属性注入现有对象的能力(就像Python,Ruby和Groovy等动态语言允许的那样).
在将源代码传递给编译器之前,我想在编译时转换 java源代码.换句话说,我想创建一个能够转换的预处理器
"bla bla bla"
Run Code Online (Sandbox Code Playgroud)
进入任何其他代码,如:
new MyClass("bla", 3)
Run Code Online (Sandbox Code Playgroud)
我的实际动机是进行字符串加密,如此处所述
有些人建议编写自定义注释处理器,但据我理解注释:
有些人建议使用Spoon或ObjectsWeb ASM等框架,但这些框架在现有代码库中学习和部署似乎很复杂.
我茁壮成长为两种方法找到一个简单的java代码预处理示例.
有没有人看到任何聪明的方法进行代码转换,而没有用多个常春藤模块完全改变现有的大型代码库?注释似乎是最好的方法,但我不明白该怎么做.
我想实现一个基于现有"prototype"类生成新类的注释处理器.
import java.util.List
@MyAnnotation
class MySuperClassPrototype {
static MySuperClassPrototype createInstance() {
return new MySuperClassPrototype();
}
}
Run Code Online (Sandbox Code Playgroud)
由于下面的代码.将生成以下新源文件(编译单元):
import java.util.List
class MySuperClass {
static MySuperClass createInstance() {
return new MySuperClass();
}
public void specialAddedMethod() {
/*...*/
}
}
Run Code Online (Sandbox Code Playgroud)
我想复制所有顶级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方法,我得到了不错的结果,但是构造函数被打印为具有"<init>"名称的方法而不是与其类同名的方法,因此我需要手动打印每种树节点.
你可以看到我在这里附带的代码
java ×3
annotations ×1
boo ×1
c++ ×1
clojure ×1
compilation ×1
haskell ×1
lisp ×1
reflection ×1
templates ×1
terminology ×1