私は私の以前のプロジェクトに書いていることをいくつかの定型的なコードを生成します(ちょうど楽しみのために)簡単な注釈プロセッサを書かれています。これは、実際のアクティビティクラスに注釈を収集することにより、以下のようなモジュールを生成します
@Module
abstract class ActivityInjectorModule {
@ContributesAndroidInjector
abstract fun providesMain2Activity(): Main2Activity
@ContributesAndroidInjector
abstract fun providesMainActivity(): MainActivity
}
私は短剣でそれを実行したときしかし、短剣は私の注釈プロセッサによって生成されたクラスを見つけることができないよう。、クラスが生成され、生成されたディレクトリに存在しているが、私は私のソースコードではなく、コンパイルにそれを使用することができ、短剣は、次の例外を生成します。任意の専門家の提案?
error: cannot find symbol
@dagger.Component(modules = {dagger.android.AndroidInjectionModule.class, com.mallaudin.daggietest.di.AppModule.class, ActivityInjectorModule.class})
^
symbol: class ActivityInjectorModule
これは、メインのアプリケーションコンポーネントです。
@Singleton
@Component(
modules = [
AndroidInjectionModule::class,
AppModule::class,
ActivityInjectorModule::class
]
)
interface AppComponent : AndroidInjector<App> {
@Component.Builder
interface Builder {
fun addContext(@BindsInstance ctx: Context): Builder
fun build(): AppComponent
}
}
ActivityInjectorModuleのクラスには、注釈プロセッサによって生成され、生成されたディレクトリに存在しています。
Applicationクラス
class App : DaggerApplication() {
override fun applicationInjector(): AndroidInjector<out DaggerApplication> {
return DaggerAppComponent.builder().addContext(this).build()
}
}
私は、生成されたクラスを自分で作成する場合はすべてが、完璧に動作します。どういうわけか、コンパイル時に、短剣は私の注釈プロセッサによって生成されたときに、クラスを見つけることができません。
ユーリークリコフの答えの後、
あなたは、生成されたファイルは、同じパッケージ内にあるだけでなく、完全修飾名で参照見ることができます。まだ短剣レポートエラー。
ここにあるリンク誰かが実験したい場合はgithubのリポジトリには、
解決:
- Javaコードを生成します。
Kapt
複数のラウンドをサポートしていません。 - 可能な限り早いラウンドで生成されたファイルを書き込みます。
説明:
Javac
注釈プロセッサは、ラウンドを使用する代わりに、プロセッサの順序を定義します。だから、通常は簡略化されたアルゴリズムは、そのようなものです:
- すべてのJavaソースを収集
- すべての注釈プロセッサを実行します。任意の注釈プロセッサを使用して新しいファイルを生成することができますファイラーを。
- 生成されたすべてのファイルを収集し、いずれかがある場合は、再びステップ2を実行します。
- 生成されたファイルがない場合は、1以上のラウンドを実行RoundEnvironment.processingOver()リターンを
true
、このシグナル伝達することは、最後のラウンドです。
今について少しkapt
。Kapt
用途javacは注釈プロセッサを実行します。それを可能にするために、それがために最初kotlin complilerを実行するJavaスタブファイルを生成して実行しjavac
、それらに。現在、kapt
複数のラウンドをサポートしていません、それは注釈プロセッサによって生成されたクラスkotlinのJavaスタブを生成しない意味。注:javac
まだ複数のラウンドを使用して、それだけで生成されたkotlinソースを拾うことができません。
だから、あなたの質問に戻って。一つの可能なオプションは、それがているように、別のモジュールにあなたの生成されたクラスを移動させることで、ここで説明しました。
しかし、最も簡単なオプションは直接Javaコードを生成することであり、あなたの生成されたJavaクラスは、によってピックアップされるjavac
短剣がそれらを処理する注釈処理の第二ラウンドを立ち上げ、自動的に。
ちょうど少数のより多くの注意事項:
- ときにコードを生成しません
RoundEnvironment.processingOver() == true
、それは別のラウンドをトリガしません。あなたは注釈を参照してください同じラウンド中にそれを生成します。 - 注釈プロセッサに生成されたコードが表示されるように、使用してそれを書くファイラーを。