package privateメソッドでは同シグネチャのメソッドが継承先のクラスに存在した場合でも、継承元と先のクラスが属するパッケージが異なる場合オーバーライドされていないので別のメソッドとして取り扱う
class pkg1 .A {
// Inject対象
@ Inject
void inject () {}
// Inject対象
@ Inject
void same () {}
}
class pkg2 .B extends pkg1 .A {
// Inject対象外
void inject () {}
// Inject対象
@ Inject
void same () {}
}
privateメソッドはオーバーライドできないので、@Injectが付与されたメソッドそれぞれがInject対象となる(同シグネチャでも別のメソッドとして取り扱う)
class A {
// Inject対象
@ Inject
private void inject () {}
// Inject対象
@ Inject
private void inject1 () {}
}
class B extends A {
// Inject対象外
private void inject () {}
// Inject対象
@ Inject
private void inject1 () {}
}
オーバーライド先のメソッドで@Injectが付与されていなければInject対象とならない(アノテーションもオーバーライドされるため)
class A {
// Inject対象外
@ Inject
void inject () {}
}
class B extends A {
// ここで@Injectが消去されてオーバーライドされている
void inject () {}
}
同じ継承関係でもこの場合はBクラスをnewするときはB#injectのみをInjectし、Cクラスをnewするときはどのinjectメソッドも実行してはならない
class A {
@ Inject
public void inject () {}
}
class B extends A {
@ Inject
public void inject () {}
}
class C extends B {
public void inject () {}
}
(一つ前の続き)ただし、この場合はBクラスをnewするときは1と2をInjectし、Cクラスをnewするときは2と3がInject対象となる
class pkg1 .A {
// 1
@ Inject
void inject () {}
}
class pkg2 .B extends pkg1 .A {
// 2
@ Inject
void inject () {}
}
class pkg1 .C extends pkg2 .B {
// 3
@ Inject
void inject () {}
}
// 1と2がInject対象
Injector .getInstance (B );
// 2と3がInject対象
Injector .getInstance (C );