我正在尝试生成具有循环类依赖性的类,类似于这个问题:Byte Buddy - 处理生成的类中的循环引用
作为一个最小的例子,我想要生成的类有这样的依赖:
//class A depends on class B, and vice-versa
final class A { B theB; }
final class B { A theA; }
Run Code Online (Sandbox Code Playgroud)
上面链接中接受的答案没有为我提供足够的信息来实现这一点.这是我试过的:
import net.bytebuddy.ByteBuddy;
import net.bytebuddy.description.type.TypeDescription;
import net.bytebuddy.dynamic.DynamicType;
import net.bytebuddy.dynamic.loading.ClassLoadingStrategy;
import net.bytebuddy.jar.asm.Opcodes;
public class ByteBuddyHello {
public static void main(String[] args) {
try {
final ByteBuddy bb = new ByteBuddy();
final TypeDescription.Latent typeDescrA = new TypeDescription.Latent("A", 0, null, null);
final TypeDescription.Latent typeDescrB = new TypeDescription.Latent("B", 0, null, null);
final DynamicType.Unloaded<Object> madeA = bb …Run Code Online (Sandbox Code Playgroud) 我试图推断出Hotspot的JIT原因.我最感兴趣的是最新的编译阶段(C2编译器).Java中的JIT是否依赖于断言进行优化?如果是这种情况,我可以想象有一些例子可以在启用断言的情况下更快地运行代码.
例如,在这样的代码中:
static int getSumOfFirstThree(int[] array) {
assert(array.length >= 3);
return array[0] + array[1] + array[2];
}
Run Code Online (Sandbox Code Playgroud)
我已经实现了一个 AnnotationProcessor,它拾取带有字符串参数的类注释。字符串参数是特定于域的语言中的表达式,注释处理器将使用它来编译类文件。
我创建了一个小型测试项目来尝试一下。我看到的行为是这样的:
我尝试查找问题并发现:
正在生成的类文件正在 target/classes/package/name/KlassName.class 中创建(这是 Filer::createClassFile 方法选择的位置,但我希望它会转到某个单独的目录) 。
如果我在注释处理期间创建一个java源文件(使用Filer::createSourceFile),intellij将没有问题。但是,我不能这样做,因为编译器是一个确实必须直接创建类的库。
我对解决方案可能是什么样子有两种猜测:
我使用intellij IDEA 2016.2.1和intellij IDEA 2017.2 EAP重现了这个问题。
java compiler-construction intellij-idea maven annotation-processing
我遇到过一个案例,我认为JIT应该很容易优化,但似乎并没有.
我把问题简化为一个最小的例子:
考虑一个类IntArrayWrapper:
class IntArrayWrapper {
private int[] data = new int[100000];
public void setInteger(int i, Integer x) { data[i] = x; }
public void setInt (int i, int x) { data[i] = x; }
}
Run Code Online (Sandbox Code Playgroud)
两种方法之间的唯一区别x是Integer(盒装)或int(基元).
我已经编写了一些JMH基准来衡量这两种方法的性能:
@Benchmark
public void bmarkSetIntConst() {
final IntArrayWrapper w = new IntArrayWrapper();
for (int i = 0; i < 100000; i++) {
w.setInt(i, 100);
}
}
@Benchmark
public void bmarkSetIntStair() {
final IntArrayWrapper w = …Run Code Online (Sandbox Code Playgroud)