小编Ste*_*uer的帖子

Byte-buddy:生成具有循环类型的类

我正在尝试生成具有循环类依赖性的类,类似于这个问题: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)

java byte-buddy

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

Java,断言和JIT

我试图推断出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)
  • 当断言被启用时,JIT是否足够聪明以消除对数组访问的边界检查?
  • 或者,您是否可以想到其他情况(实际与否)断言实际上会改进JIT编译的本机代码?

java jit

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

IntelliJ 不选取生成的 .class 文件

我已经实现了一个 AnnotationProcessor,它拾取带有字符串参数的类注释。字符串参数是特定于域的语言中的表达式,注释处理器将使用它来编译类文件。

我创建了一个小型测试项目来尝试一下。我看到的行为是这样的:

  1. 我可以使用maven成功构建项目
  2. 我可以从 intellij 中成功运行该项目
  3. 尽管项目在 intellij 中运行,但生成的类在编辑器中无法识别(“无法解析类 '...'”),并且 Intelli-sense 也不起作用。

我尝试查找问题并发现:

  • 正在生成的类文件正在 target/classes/package/name/KlassName.class 中创建(这是 Filer::createClassFile 方法选择的位置,但我希望它会转到某个单独的目录) 。

  • 如果我在注释处理期间创建一个java源文件(使用Filer::createSourceFile),intellij将没有问题。但是,我不能这样做,因为编译器是一个确实必须直接创建类的库。

我对解决方案可能是什么样子有两种猜测:

  1. 此问题可能源于 intellij 在编辑器窗口中进行类型检查时未查看目标/类内部。
  2. 类文件应该在单独的目录中生成。如果是这样,解决这个问题的设置是什么?

我使用intellij IDEA 2016.2.1和intellij IDEA 2017.2 EAP重现了这个问题。

java compiler-construction intellij-idea maven annotation-processing

5
推荐指数
0
解决办法
891
查看次数

奇怪的表现(盒装整数)

我遇到过一个案例,我认为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)

两种方法之间的唯一区别xInteger(盒装)或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)

java optimization performance jit

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