[java]privateなメソッドにアクセスするもうひとつのやり方
2006/07/18
2006/11/26
private,protectedなメソッドにアクセスしたいときがある。
javaのコンパイル結果のバイトコードを操作する方法で考えてみたい。
javassist
を使用してみる。
インターネットにはjavassistを紹介したよいページがたくさんありますが、ちょいと自分でためしてみることにする。
このようなクラスがある。
public class A_A {
private String s = "hello";
private String getS(){
System.out.println("i am privte method!!");
return s;
}
}
getSメソッドにアクセスしたいのだが、アクセス修飾子がprivateである。
getSにアクセスするための別のメソッドを足してみるという方法をとってみる。
サンプルコードは以下
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import javassist.CannotCompileException;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;
import javassist.CtNewMethod;
import javassist.NotFoundException;
public class TestAccessPrivateMethod {
public static void main(String[] args) throws NotFoundException,
CannotCompileException, InstantiationException,
IllegalAccessException, SecurityException, NoSuchMethodException,
IllegalArgumentException, InvocationTargetException {
ClassPool pool = ClassPool.getDefault();
CtClass myCtClass = pool.get("A_A");
CtMethod newMethod = CtNewMethod.make("public String getS2() {"
+ " return getS(); }", myCtClass);
myCtClass.addMethod(newMethod);
Class myClass = myCtClass.toClass();
Object my = myClass.newInstance();
Method exeMth = myClass.getMethod("getS2", new Class[] {});
System.out.println(exeMth.invoke(my, new Object[] {}));
}
}
getS2というメソッドを作成して、追加している。
その他リンク
javassistチュートリアル
Javassist メモ
javaのコンパイル結果のバイトコードを操作する方法で考えてみたい。
javassist
を使用してみる。
インターネットにはjavassistを紹介したよいページがたくさんありますが、ちょいと自分でためしてみることにする。
このようなクラスがある。
public class A_A {
private String s = "hello";
private String getS(){
System.out.println("i am privte method!!");
return s;
}
}
getSメソッドにアクセスしたいのだが、アクセス修飾子がprivateである。
getSにアクセスするための別のメソッドを足してみるという方法をとってみる。
サンプルコードは以下
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import javassist.CannotCompileException;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;
import javassist.CtNewMethod;
import javassist.NotFoundException;
public class TestAccessPrivateMethod {
public static void main(String[] args) throws NotFoundException,
CannotCompileException, InstantiationException,
IllegalAccessException, SecurityException, NoSuchMethodException,
IllegalArgumentException, InvocationTargetException {
ClassPool pool = ClassPool.getDefault();
CtClass myCtClass = pool.get("A_A");
CtMethod newMethod = CtNewMethod.make("public String getS2() {"
+ " return getS(); }", myCtClass);
myCtClass.addMethod(newMethod);
Class myClass = myCtClass.toClass();
Object my = myClass.newInstance();
Method exeMth = myClass.getMethod("getS2", new Class[] {});
System.out.println(exeMth.invoke(my, new Object[] {}));
}
}
getS2というメソッドを作成して、追加している。
その他リンク
javassistチュートリアル
Javassist メモ
: