TLDR; 生成された型はパッケージ プライベートであり、デフォルトではリフレクションを使用してデフォルトでアクセスできないため、
JDBI@BindBean
アノテーションはwith AutoValue で生成された型を生成します。IllegalAccessException
JDBI は柔軟性がないのでしょうか、それとも AutoValue による回避策はありますか? (以下の質問全文)
簡単な背景
ソースが AutoValue を使用して生成された型でJDBI@BindBean
アノテーションを使用しようとしています。
package com.example;
@AutoValue
public abstract class Foo {
public String getBar();
}
問題は、生成されたコードが次のようになることです。
package com.example;
@AutoValue
class AutoValue_Foo extends Foo {
private final String bar;
@Override
public String getBar() {
return this.bar;
}
// toString, equals, hashCode
}
クラスがパッケージ プライベートであることに注意してください。
を使用しようとする@BindBean
と、たとえば次のようになります。
@SqlQuery("select * from baz where bar = :foo.bar")
Condition find(@BindBean("foo") Foo foo);
AutoValue_Foo
パッケージは非公開であり、BindBeanFactory
リフレクションを使用するためfind
、AutoValue_Foo
型で呼び出しを試みると、結果は次のようになります。
java.lang.IllegalAccessException: ... can not access a member of class com.example.Foo with modifiers "public"
関連する JDBI コードはこちらです。Java リフレクションの観点からは、これを使用して解決できることは理解していますsetAccessible(true)
が、それには JDBI への PR が必要です。
したがって、質問は次のとおりです。
新しい JDBI マッパーを作成せず
Foo
にタイプAutoValue_Foo
をバインドできるコードを再構築する方法はありますか?@BindBean
@AutoValue
であるクラスを生成 する方法はありますかpublic
。これが一般的に望ましくない理由を理解しています(人々に実装ではなくインターフェイスを使用するように促します)。BindBeanFactory
柔軟性がありませんか?setAccessible(true)
元のパッケージの外部で利用可能なメソッドを利用する必要 がありますか?