プログラマメモ2 - programmer no memo2

[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 メモ

: