Javaでは、private
アクセス修飾子はクラスの外からは見えないため、安全であると見なされます。それから、外の世界もその方法について知りません。
しかし、Javaリフレクションはこのルールを破るために使用できると思いました。次のケースを検討してください。
public class ProtectedPrivacy{
private String getInfo(){
return "confidential";
}
}
次に、別のクラスから情報を取得します。
public class BreakPrivacy{
public static void main(String[] args) throws Exception {
ProtectedPrivacy protectedPrivacy = new ProtectedPrivacy();
Method method = protectedPrivacy.getClass().getDeclaredMethod("getInfo", null);
method.setAccessible(true);
Object result = method.invoke(protectedPrivacy);
System.out.println(result.toString());
}
}
上記のようなことをするためにはメソッド名を知らなければならないので、現時点では私はまだプライベートメソッドが安全だと思っていました。しかし、他の誰かが作成したプライベートメソッドを含むクラスの場合、それらの可視性はありません。
しかし、コード行の下なので、私のポイントは無効になります。
Method method[] = new ProtectedPrivacy().getClass().getDeclaredMethods();
これにmethod[]
は、上記のことを行うために必要なすべてのものが含まれています。私の質問は、Javaリフレクションを使用してこのようなことを回避する方法はありますか?
私の質問を明確にするために、Javaドキュメンテーションからいくつかのポイントを引用します。
アクセスレベルの選択に関するヒント:
他のプログラマがクラスを使用する場合、誤用によるエラーが発生しないようにする必要があります。アクセスレベルは、これを行うのに役立ちます。特定のメンバーにとって意味のある最も制限されたアクセスレベルを使用します。正当な理由がない限り、プライベートを使用してください。
getDeclaredMethods
ガベージのように見える名前が返されるため、役立つ場合があります。