相关疑难解决方法(0)

Java注释的默认值是否编译为字节码?

我尝试为Java字节码实现几个静态分析.他们试图计算某个方法是否具有特定属性,例如是工厂方法.因为这些分析很难测试,所以我决定编写一些Java代码并使用正确的属性直接注释方法.运行分析后,很容易自动检查计算属性和带注释的属性是否相同.

MyAnnotation:

@Retention(RUNTIME)
@Target(METHOD)
public @interface FactoryMethodProperty {

    FactoryMethodKeys value() default FactoryMethodKeys.NonFactoryMethod;
}
Run Code Online (Sandbox Code Playgroud)

示例测试代码:

public class PublicFactoryMethod {

    private PublicFactoryMethod(){
        // I'm private
    }

    @FactoryMethodProperty
    public static void newInstanceAfterOtherConstructorCall(){
        new TransFacoryMethod();
        new PublicFactoryMethod();
    }

    @FactoryMethodProperty(FactoryMethodKeys.IsFactoryMethod)
    public static PublicFactoryMethod newInstance(){
        return new PublicFactoryMethod();
    }
}
Run Code Online (Sandbox Code Playgroud)

因为我的测试代码中的大多数方法都不是工厂方法,所以我将默认设置为枚举值"FactoryMethodKeys.NonFactoryMethod".但是当我没有将枚举值显式传递给注释时,它不会被编译为字节码.

字节码:

 #23 = Utf8               value
  #24 = Utf8               Lorg/opalj/fpa/test/annotations/FactoryMethodKeys;
  #25 = Utf8               IsFactoryMethod

{
  public static void newInstanceAfterOtherConstructorCall();
    descriptor: ()V
    flags: ACC_PUBLIC, ACC_STATIC
    RuntimeVisibleAnnotations:
      0: #16()
    Code:
      stack=1, locals=0, args_size=0
         0: new           #17                 // class …
Run Code Online (Sandbox Code Playgroud)

java annotations bytecode java-8

12
推荐指数
2
解决办法
879
查看次数

如何在Java字节码中表示java注释

我试图反编译包含JUnit测试的.class文件.我读了字节码,但是我没有看到@Test注释的任何线索(它在java源代码中使用).

作为元数据,如何在字节码中表示注释?

java annotations decompiling bytecode declarative

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

标签 统计

annotations ×2

bytecode ×2

java ×2

declarative ×1

decompiling ×1

java-8 ×1