相关疑难解决方法(0)

lombok是如何工作的?

我今天遇到了lombok.
我非常想知道它是如何工作的.
Java Geek文章提供了一些线索,但对我来说并不是很清楚:

Java 6删除了apt并使javac能够管理注释,简化流程以获得更简单的单步计算.这是龙目岛采取的路径.

也许使用Java 6编译过程将是:javac - > apt - > lombok apt process - >读取类文件并使用ASM添加set/get方法?

你能告诉我关于机制的更多细节吗?

java annotations lombok

134
推荐指数
4
解决办法
3万
查看次数

Java中是否可以进行静态元编程?

我是C++静态元编程的粉丝.我知道Java现在有泛型.这是否意味着Java中可能存在静态元编程(即编译时程序执行)?如果是这样,任何人都可以推荐任何可以了解更多信息的好资源吗?

java metaprogramming

36
推荐指数
4
解决办法
9370
查看次数

如何在最终编译之前使用java注释修改源代码?

我从apt工具页面读到,可以创建AnnotationProcessors来生成新的派生文件(源文件,类文件,部署描述符等).我正在寻找这样做的例子.

我需要在编译时对所有带注释的字符串进行编码,以便读取类文件不允许读取静态字符串:

基本代码:

String message = (@Obfuscated "a string that should not be readable in class file");
Run Code Online (Sandbox Code Playgroud)

应该重新修改为:

String message = new ObfuscatedString(new long[] {0x86DD4DBB5166C13DL, 0x4C79B1CDC313AE09L, 0x1A353051DAF6463BL}).toString();
Run Code Online (Sandbox Code Playgroud)

基于ObfuscatedString.obfuscate(String)TrueLicense框架的静态方法,处理器可以生成代码以替换带注释的字符串.实际上,这个方法生成字符串"new ObfuscatedString([numeric_code]).toString()".在运行时,ObfuscatedString的toString()方法能够返回在数字代码中编码的字符串.

关于如何编写AnnotationProcessor的process()方法来编辑带注释的代码的任何想法?

提前致谢,

java apt annotations

11
推荐指数
1
解决办法
2647
查看次数

Java中有没有办法创建或模拟类似于"+ ="的语法?没有超载

编辑:我已经重写了这个问题,希望能让它更容易理解.

我不想超载!

如果您有以下代码:

ImmutableObject mutableReference = new ImuttableObject();

mutableReference = mutableReference.doStuff(args);
Run Code Online (Sandbox Code Playgroud)

编译时或预编译时可以替换定义的文本格式吗?例如:

DEFINE X.=Y AS X = X.Y

可取代
mutableReference .= doStuff(args)mutableReference = mutableReference.doStuff(args);

因此,某些过程知道".="之前的代码是X,之后是Y.类似于语法糖,在编译之前或期间,只需用X = XY替换X. = Y

以下是问题的旧版本.

由于缺少更好的单词,我有以下"形式"的代码.

turnStates = turnStates.add(currentState); // log end of turn state.

            //turnStates.=add(currentState);
            //turnStates=.add(currentState);
Run Code Online (Sandbox Code Playgroud)

其中turnStates可以是对任何不可变对象的引用.我希望它看起来像注释掉或类似的代码.就像有++和+ =的整数一样,我想为自己的不可变量编写自己的方法.

我想我记得一些来自C++的预处理器东西,我认为它可以取代代码片段的预定义文本.我想知道在java中是否有一种方法可以定义在编译时替换所需代码的过程.

我确信您可以让IDE执行此操作,但是您无法与未运行预配置IDE的其他人共享代码.

编辑:

turnStates是不可变的,并在要添加的调用中返回不同的对象.它是测试代码,我有我的理由为什么列表,或者它现在更像是一个堆栈,是不可变的.无关,因为我可以简单地将其替换为的问题 player = player.doSomething(args),其中doSomething(args)返回一个Player实例.玩家只是模型的一小部分,不可改变是不可改变的.

我知道在Java中无法更改Overloads和语法.当我试图描绘最初时,抱歉,如果它没有遇到这种方式是:

我希望我不知道在编译之前可能替换文本的@符号的语法.例如:

DEFINE X.=Y AS X = X.Y 其中X = turnStates,Y = add()在我的例子中.

但正如我提出的答案所说的那样.我会查看Scala,因为答案似乎是否定的.

java

1
推荐指数
1
解决办法
81
查看次数

标签 统计

java ×4

annotations ×2

apt ×1

lombok ×1

metaprogramming ×1