第三者libの私的で保護されたメソッドにアクセスする必要があります。パフォーマンス要件のために反射を使用することはできません。たぶん私はこれを行うことを許可する任意のコンパイラ設定がありますか?Javaの可視性修飾子をバイパス
0
A
答えて
0
あなたのメソッドの修飾子を変更し、Javassistのようなバイトコードを操作できるライブラリを使用してバイトコードを再生成し、古いクラスを新しく生成されたクラスに置き換えることができます。
たとえば、クラスorg.apache.commons.io.FileUtils
では、タイプprivate static long sizeOf0(File file)
のメソッドがありますが、それをpublic
にしたいとします。あなたの新しいFileUtils.class
を生成する次進行するJavassistので
:
ClassPool pool = ClassPool.getDefault();
// Get the class org.apache.commons.io.FileUtils which is the class that
// contains the method to modify
CtClass fileUtilsClass = pool.get("org.apache.commons.io.FileUtils");
// Get the class java.io.File which is the type of the parameter
CtClass fileClass = pool.get("java.io.File");
// Get the method to which we want to change the modifier
CtMethod method = fileUtilsClass.getDeclaredMethod("sizeOf0", new CtClass[]{fileClass});
// Set the modifier of the method to public
method.setModifiers(Modifier.PUBLIC);
// Write the new FileUtils.class in the user home directory following the package name
fileUtilsClass.writeFile(".");
ここから、単純に直接瓶に古いFileUtils.class
を交換し、それが元ではないことを示すためにjarファイルの名前を変更することができますパッチされたjarファイルです。例えば、commons-io-2.5.jar
の名前をcommons-io-2.5-patch-01.jar
のように変更することができます。
関連する問題
- 1. 目的関数cのアクセス修飾子の可視性
- 2. Kotlinのパッケージに相当する可視性修飾子
- 3. Java抽象修飾子
- 4. Javaの修飾子で他の注釈
- 5. Java修飾子の構文とフォーマット
- 6. アクセス修飾子
- 7. 修飾子
- 8. セッション修飾子
- 9. プロパティ修飾子
- 10. アクセス修飾子
- 11. パッケージプライベートアクセス修飾子
- 12. private修飾子
- 13. 修飾子のエラー
- 14. 「プライベート」可視性修飾子 - C#をVBに変換する際の違いを処理する方法は?
- 15. OpenGL:レイアウト修飾子?
- 16. Gtk keypress修飾子
- 17. Vue.js - マウスイベント修飾子
- 18. アノテーション値を無視するインターセプタ修飾子を作成する
- 19. quadrify maxscriptをスクリプト修飾子
- 20. ConcurrentHashMap修飾子の同期
- 21. __device__修飾子の範囲
- 22. マクロ内のコロン修飾子
- 23. テンプレートクラスのconst修飾子コンストラクタ
- 24. "Windows"キーのInputGesture修飾子
- 25. CodeModel修飾子の順番
- 26. デフォルトのアクセス修飾子7
- 27. $ inc修飾子のMongoKittenサポート
- 28. Delphiのアクセス修飾子
- 29. C#のクラスアクセス修飾子
- 30. java access修飾子 - タイプが他のクラスである属性の可視性。なぜそれが見えるかどうか?
プライベートな理由があります。 –
保護されたものが必要な場合は、クラスを継承して不正行為をする可能性があります。私的なものが必要な場合は、リフレクションを使用したり、コードを変更したりすることはできません。あなたは運が悪いと思います。しかし、これらのことのいずれかを調べる前に、私はそれを却下する前にリフレクションを使用するパフォーマンスを測定したいと思います。 – Bill
これらのメソッド/フィールドの可視性を変更するために、バイトコード(asmなど)を書き直すことができます。 「遅すぎる」とは何のことを言っているのですか?反射は実際にはかなり速いです。 –