次の問題に遭遇しました。
パッケージに 2 つの異なるパッケージがあり、a
パッケージ内のインターフェイスの実装されたメソッドを呼び出したいのですb
が、実装するクラスにはパッケージの可視性があります。
したがって、単純化されたコードは次のようになります。
package b;
public final class Factory {
public static B createB() {
return new ImplB();
}
public interface B {
void method();
}
static class ImplB implements B {
public void method() {
System.out.println("Called");
}
}
}
そして呼び出し元:
package a;
import java.lang.reflect.Method;
import b.Factory;
import b.Factory.B;
public final class Invoker {
private static final Class<?>[] EMPTY_CLASS_ARRAY = new Class<?>[] {};
private static final Object[] EMPTY_OBJECT_ARRAY = new Object[] {};
public static void main(String... args) throws Exception {
final B b = Factory.createB();
b.method();
final Method method = b.getClass().getDeclaredMethod("method", EMPTY_CLASS_ARRAY);
method.invoke(b, EMPTY_OBJECT_ARRAY);
}
}
プログラムを開始すると、パッケージの可視性が検出されたメソッドの呼び出しを禁止しているため、期待どおりに出力さCalled
れ、例外がスローされます。
だから私の質問は、この問題を解決する方法はありますか? 私はJavaドキュメントに何か欠けているのでしょうか、それとも単純に実装されたメソッドをリフレクションなしで呼び出すことは可能ですが、これは単に不可能です.