第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

Dagger 找不到其他注釋處理器生成的類

Dagger 找不到其他注釋處理器生成的類

江戶川亂折騰 2023-04-26 14:46:19
我已經(jīng)編寫(xiě)了一個(gè)簡(jiǎn)單的 Annotation Processor(只是為了好玩),它將生成一些我在之前的項(xiàng)目中編寫(xiě)的樣板代碼。它實(shí)際上通過(guò)收集 Activity 類上的注解來(lái)生成如下所示的模塊@Moduleabstract class ActivityInjectorModule {  @ContributesAndroidInjector  abstract fun providesMain2Activity(): Main2Activity  @ContributesAndroidInjector  abstract fun providesMainActivity(): MainActivity}但是,當(dāng)我用匕首運(yùn)行它時(shí),匕首似乎無(wú)法找到我的注釋處理器生成的類。雖然類已生成并存在于生成的目錄中,但我可以在我的源代碼中使用它,但在編譯時(shí),匕首會(huì)產(chǎn)生以下異常。有專家建議嗎?error: cannot find symbol@dagger.Component(modules = {dagger.android.AndroidInjectionModule.class, com.mallaudin.daggietest.di.AppModule.class, ActivityInjectorModule.class})                                                                                                                       ^  symbol: class ActivityInjectorModule這是主要的應(yīng)用程序組件。@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類由注釋處理器生成并存在于生成的目錄中。應(yīng)用類class App : DaggerApplication() {    override fun applicationInjector(): AndroidInjector<out DaggerApplication> {        return DaggerAppComponent.builder().addContext(this).build()    }}如果我自己創(chuàng)建生成的類,一切都很完美。不知何故在編譯時(shí),匕首無(wú)法找到我的注釋處理器生成的類。在 Yuriy Kulikov 的回答之后,您可以看到生成的文件在同一個(gè)包中,但也使用完全限定名稱進(jìn)行引用。還是dagger報(bào)錯(cuò)。如果有人想試驗(yàn),這里是github 存儲(chǔ)庫(kù)的鏈接
查看完整描述

3 回答

?
拉丁的傳說(shuō)

TA貢獻(xiàn)1789條經(jīng)驗(yàn) 獲得超8個(gè)贊

解決方案:

  1. 生成java代碼。Kapt?不支持多輪。

  2. 在盡可能早的一輪寫(xiě)入生成的文件。

解釋:

Javac注釋處理器使用回合而不是定義處理器順序。所以通常簡(jiǎn)化的算法是這樣的:

  1. 收集所有 java 資源

  2. 運(yùn)行所有注釋處理器。任何注釋處理器都可以使用Filer生成新文件。

  3. 收集所有生成的文件,如果有,請(qǐng)?jiān)俅芜\(yùn)行步驟 2。

  4. 如果沒(méi)有生成文件,則再運(yùn)行一輪RoundEnvironment.processingOver()返回true,表示這是最后一輪。

這是對(duì)這個(gè)過(guò)程的一個(gè)很好的解釋

現(xiàn)在有點(diǎn)關(guān)于kaptKapt?使用 javac運(yùn)行注解處理器。為了使其成為可能,它首先運(yùn)行 kotlin compliler 以生成 java 存根文件并javac在其上運(yùn)行。目前kapt?不支持多輪,這意味著它不會(huì)為注釋處理器生成的 kotlin 類生成 java 存根。?注意:javac仍然使用多輪,只是無(wú)法獲取生成的 kotlin 源代碼。

那么,回到你的問(wèn)題。一種可能的選擇是將您生成的類移動(dòng)到一個(gè)單獨(dú)的模塊中

但最簡(jiǎn)單的選擇是直接生成 java 代碼,你生成的 java 類將被自動(dòng)拾取javac,啟動(dòng)第二輪注釋處理,dagger 將在其中處理它們。

再補(bǔ)充幾點(diǎn):

  • 不要在 時(shí)生成您的代碼RoundEnvironment.processingOver() == true,它不會(huì)觸發(fā)另一輪。在您看到注釋的同一輪中生成它。

  • 要使生成的代碼對(duì)注釋處理器可見(jiàn),請(qǐng)使用Filer編寫(xiě)它。


查看完整回答
反對(duì) 回復(fù) 2023-04-26
?
一只名叫tom的貓

TA貢獻(xiàn)1906條經(jīng)驗(yàn) 獲得超3個(gè)贊

新答案 我以某種方式錯(cuò)過(guò)了您正在使用 kapt。Kapt 可以處理你的類,即使沒(méi)有完整的限定名(這很了不起),如果你將它添加到你的 build.gradle 中:


kapt {

    arguments {

        arg("argumentIncremental", 'true')

    }


    correctErrorTypes = true


}

有關(guān)此的更多信息:https ://kotlinlang.org/docs/reference/kapt.html#non-existent-type-correction


以前的答案可能很有用,有人對(duì) gradle 中的 annotationProcessor (apt) 有同樣的問(wèn)題。


簡(jiǎn)短回答:使用 ActivityInjectorModule 的完全限定名稱:


@dagger.Component(modules = {dagger.android.AndroidInjectionModule.class, com.mallaudin.daggietest.di.AppModule.class, com.mallaudin.daggietest.di.ActivityInjectorModule.class})

或者將兩個(gè)文件放在同一個(gè)包中。


長(zhǎng)答案:Dagger 是一個(gè)注釋處理器,它在您的代碼編譯之前運(yùn)行,并且(可能)在您的其他注釋處理器運(yùn)行之前運(yùn)行。處理器運(yùn)行的順序未定義。


Dagger 注釋處理器將處理用 @dagger.Component 注釋的 TypeElement,它會(huì)嘗試找到所有模塊,包括“ActivityInjectorModule.class”。問(wèn)題是,ActivityInjectorModule 可能還沒(méi)有生成。因此“ActivityInjectorModule”此時(shí)不會(huì)有包。Dagger 將假定 ActivityInjectorModule 與 Component 類位于同一個(gè)包中,并且不會(huì)添加導(dǎo)入。通常的解決方法是為生成的類使用完全限定名稱,如果它們被其他注釋處理器使用的話。有時(shí)將注釋處理移動(dòng)到不同的 gradle 模塊是有意義的,但我不認(rèn)為這是你想要的。


查看完整回答
反對(duì) 回復(fù) 2023-04-26
?
尚方寶劍之說(shuō)

TA貢獻(xiàn)1788條經(jīng)驗(yàn) 獲得超4個(gè)贊

可能有更優(yōu)雅的方法來(lái)解決這個(gè)問(wèn)題,但最簡(jiǎn)單和最可靠的解決方案是執(zhí)行兩次傳遞 — 一次javac僅運(yùn)行注釋處理器,第二次執(zhí)行它通常執(zhí)行的所有操作。


該javac 文檔指定了兩個(gè)可以幫助您的選項(xiàng)。


-proc:{無(wú),僅}


控制注釋處理和/或編譯是否完成。-proc:none 表示編譯在沒(méi)有注釋處理的情況下進(jìn)行。-proc:only表示只做注解處理,不做任何后續(xù)編譯。


-處理器類 1 [,類 2,類 3 ...]


要運(yùn)行的注釋處理器的名稱。這會(huì)繞過(guò)默認(rèn)的發(fā)現(xiàn)過(guò)程。


第一步(只運(yùn)行你自己的注解處理器)是


javac -proc:only -processor com.foo.bar.MyProcessor MyProject/src/*

第二遍(常規(guī)構(gòu)建)是


javac MyProject/src/*

如果您使用的是 Ant 或 Maven 之類的東西,您應(yīng)該能夠更新構(gòu)建指令,只需最少的工作量即可獲得兩次編譯器傳遞。


編輯:這是我對(duì) Gradle 說(shuō)明的嘗試


我沒(méi)有使用 Gradle 的經(jīng)驗(yàn),但看起來(lái)你需要做這樣的事情。


在您的 Gradle 構(gòu)建腳本中,您需要定義預(yù)處理任務(wù)并將對(duì)您的任務(wù)的依賴項(xiàng)添加到 javaCompile 任務(wù)。


javaCompile.dependsOn myAnnotationTask


task myAnnotationTask(type: JavaCompile) {

    options.compilerArgs << '-proc:only' << '-processors com.foo.bar.MyAnnotationProcessor'

}


查看完整回答
反對(duì) 回復(fù) 2023-04-26
  • 3 回答
  • 0 關(guān)注
  • 170 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)