почему модификатор объекта-компаньона всегда закрыт, когда я оцениваю его в процессоре аннотаций? - PullRequest
0 голосов
/ 19 сентября 2018

У меня есть пользовательская аннотация, которая Retention равна AnnotationRetention.SOURCE, и я хочу убедиться, что аннотированная переменная public static, но у меня проблема с сопутствующими объектами kotlin, и они кажутся private, даже когдая явно объявляю их public.

вот мой аннотированный код:

class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
}

companion object {
    @AZNEncryptor("the raw string")
    public var str: String? = null
}
}

и мой код процессора аннотаций:

    override fun process(set: Set<TypeElement>, roundEnvironment: RoundEnvironment): Boolean {        roundEnvironment.getElementsAnnotatedWith(AZNEncryptor::class.java).forEach { element ->

        if (element.getKind() != ElementKind.FIELD) {
            processingEnv.messager.printMessage(Diagnostic.Kind.ERROR, "this annotation can only be applied to the variables.")
            return true
        }


        val variableElement = element as VariableElement

        for(modifier in variableElement.modifiers)
        {
            processingEnv.messager.printMessage(Diagnostic.Kind.WARNING,  modifier.name)
        }

        if (!variableElement.modifiers.contains(Modifier.STATIC) || !variableElement.modifiers.contains(Modifier.PUBLIC)) {
            processingEnv.messager.printMessage(Diagnostic.Kind.ERROR, "the annotated variable must be a \"public static\"")
            return true
        }

        generateClass("constants", variableElement.simpleName.toString())

    return true
}

1 Ответ

0 голосов
/ 19 сентября 2018

Я нашел проблему.когда я декомпилировал байт-код кода kotlin, я получил этот код Java:

public final class MainActivity extends AppCompatActivity {
  @Nullable
  private static String str;

  .
  .
  .
 public static final class Companion {
  @Nullable
  public String getStr() {
     return MainActivity.str;
  }

  public void setStr(@Nullable String var1) {
     MainActivity.str = var1;
  }

  private Companion() {
  }

  // $FF: synthetic method
  public Companion(DefaultConstructorMarker $constructor_marker) {
     this();
  }
 }
}

, поскольку вы видите, что переменная меняется на private static.Мне просто нужно было использовать @JvmField, чтобы исправить эту проблему, и теперь декомпилированный байт-код выглядит следующим образом:

public final class MainActivity extends AppCompatActivity {
  @JvmField
  @Nullable
  public static String str;

  .
  .
  .
   public static final class Companion {
  private Companion() {
  }

  // $FF: synthetic method
  public Companion(DefaultConstructorMarker $constructor_marker) {
     this();
  }
  }
  }
...