注释处理器:如何知道Kotlin类是否被Element的“内部”可见性修饰符标记

时间:2018-10-29 01:36:59

标签: kotlin annotation-processing annotation-processor

我正在使用Auto Service处理一些注释,但无法确定Kotlin类是否具有注释处理器API中的“内部”可见性修饰符。

我在处理器中使用KAPT和Kotlin。依赖项:

    implementation group: 'org.jetbrains.kotlin', name: 'kotlin-reflect', version: "1.3.0-rc-190"
    implementation files("${System.properties['java.home']}/../lib/tools.jar")
    implementation 'com.squareup:kotlinpoet:1.0.0-RC2'
    implementation "com.google.auto.service:auto-service:1.0-rc4"
    kapt "com.google.auto.service:auto-service:1.0-rc4"

样品分类:

@MyAnnotation
internal class Car

我在处理方法中得到了这个的TypeElement

override fun process(annotations: MutableSet<out TypeElement>, roundEnv: RoundEnvironment): Boolean {
        roundEnv.getElementsAnnotatedWith(MyAnnotation::class.java).forEach { classElement ->
            if (classElement.kind != ElementKind.CLASS) {
                error(...)
                return true
            }
            classElement as TypeElement

但是我不知道如何检测该类是否具有“内部”修饰符。

如果我这样做:classElement.modifiers我得到了: enter image description here

关于如何检测“内部”修饰符的任何想法?

1 个答案:

答案 0 :(得分:2)

将您的Kotlin代码转换为 private void preparedata() { list = new ArrayList<String>(); Cursor res1 = mydb.getAllData1(); if (res1.getCount() == 0) { Toast.makeText(this, "No data in the database", Toast.LENGTH_SHORT).show(); } else { while (res1.moveToNext()) { list.add(res1.getString(2)); adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, list); adapter1 = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_2,array); listView.setAdapter(adapter); } } } -------------------------------------------------------------------------- autocompletetextview.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { try { Cursor res2 = mydb.getAllData1(); if (res2.getCount() == 0) { Toast.makeText(shopp.this, "no item added", Toast.LENGTH_SHORT).show(); } else { while (res2.moveToNext()) { et8.setText(res2.getString(2)); } { } } } catch (Exception e) { Toast.makeText(shopp.this, "Oops something went wrong", Toast.LENGTH_SHORT).show(); } } }); 格式时,没有.class修饰符。但是,当您反编译Kotlin代码的internal文件时,您会看到有一个.class批注。

here批注为您提供了有关二进制格式的Kotlin声明的信息。您可以使用metadata来读取和修改@Metadata文件的元数据。

因此,您需要从.class获取@Metadata批注,然后使用classElement中的Flags来查找其是否具有内部修饰符:

例如:

kotlinx-metadata