2017-01-26 7 views
0

第三者libの私的で保護されたメソッドにアクセスする必要があります。パフォーマンス要件のために反射を使用することはできません。たぶん私はこれを行うことを許可する任意のコンパイラ設定がありますか?Javaの可視性修飾子をバイパス

+4

プライベートな理由があります。 –

+3

保護されたものが必要な場合は、クラスを継承して不正行為をする可能性があります。私的なものが必要な場合は、リフレクションを使用したり、コードを変更したりすることはできません。あなたは運が悪いと思います。しかし、これらのことのいずれかを調べる前に、私はそれを却下する前にリフレクションを使用するパフォーマンスを測定したいと思います。 – Bill

+1

これらのメソッド/フィールドの可視性を変更するために、バイトコード(asmなど)を書き直すことができます。 「遅すぎる」とは何のことを言っているのですか?反射は実際にはかなり速いです。 –

答えて

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のように変更することができます。