相关疑难解决方法(0)

什么是反思,为什么它有用?

什么是反思,为什么它有用?

我对Java特别感兴趣,但我认为在任何语言中原则都是一样的.

java reflection terminology

2011
推荐指数
19
解决办法
85万
查看次数

C++模板元编程的最佳介绍?

静态元编程(又名"模板元编程")是一种很棒的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++静态元编程的知识,那么最好的来源是什么(书籍,网站,在线课件,等等)?

c++ templates metaprogramming

112
推荐指数
6
解决办法
6万
查看次数

元编程究竟是什么?

我正在阅读关于Java平台ployglot编程的 TheServerSide上的一篇文章.文章中的一些评论将元编程称为生成代码的能力(可能即时).

元编程能否动态生成代码,或者是在运行时将方法和属性注入现有对象的能力(就像Python,Ruby和Groovy等动态语言允许的那样).

metaprogramming

110
推荐指数
7
解决办法
5万
查看次数

编译时的Java代码转换

在将源代码传递给编译器之前,我想在编译时转换 java源代码.换句话说,我想创建一个能够转换的预处理器

"bla bla bla" 
Run Code Online (Sandbox Code Playgroud)

进入任何其他代码,如:

new MyClass("bla", 3) 
Run Code Online (Sandbox Code Playgroud)

我的实际动机是进行字符串加密,如此处所述

有些人建议编写自定义注释处理器,但据我理解注释:

  • 它们可用于生成新的类文件,但不能在传递给编译器之前转换现有代码
  • 它们似乎在包,类或方法级别工作,但不是方法体/实现.

有些人建议使用Spoon或ObjectsWeb ASM等框架,但这些框架在现有代码库中学习和部署似乎很复杂.

我茁壮成长为两种方法找到一个简单的java代码预处理示例.

有没有人看到任何聪明的方法进行代码转换,而没有用多个常春藤模块完全改变现有的大型代码库?注释似乎是最好的方法,但我不明白该怎么做.

java compilation code-translation

25
推荐指数
2
解决办法
3886
查看次数

用于生成编程的非C++语言?

C++可能是静态元编程最流行的语言,Java不支持它.

除了C++之外还有其他语言支持生成编程(创建程序的程序)吗?

lisp haskell boo metaprogramming clojure

24
推荐指数
7
解决办法
3600
查看次数

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 annotations metaprogramming abstract-syntax-tree

5
推荐指数
2
解决办法
2010
查看次数