javassist入门
程序员文章站
2022-04-30 11:32:22
...
之前看dubbo 里面使用javassis代替反射来调用远程请求要调用的方法 这边 写个小demo 文档教程地址 https://github.com/jboss-javassist/javassist.wiki.git
public class Test {
public static void main(String[] args) throws NotFoundException, CannotCompileException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {
ClassPool pool = ClassPool.getDefault();
//获取class
CtClass ctClass = pool.get("btree.javassisttest.Source");
///添加一个方法
CtMethod ctMethod = new CtMethod(CtClass.voidType, "runTestRunMethod", new CtClass[]{}, ctClass);
ctMethod.setModifiers(Modifier.PUBLIC);
//调用被代理类的方法
ctMethod.setBody("{ testRunMethod(); }");
ctClass.addMethod(ctMethod);
Object sourceProxy = ctClass.toClass().newInstance();
//运行
Method testRunMethod = sourceProxy.getClass().getDeclaredMethod("testRunMethod");
testRunMethod.invoke(sourceProxy);
}
}
package btree.javassisttest;
public class Source {
public void testRunMethod() {
System.err.println(
"testRunMethod 方法被调用"
);
}
}
效果
下面 可以改造一下 这个方法 在原始的方法上面 在添加一些方法
public static void main(String[] args) throws NotFoundException, CannotCompileException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {
ClassPool pool = ClassPool.getDefault();
//获取class
CtClass ctClass = pool.get("btree.javassisttest.Source");
CtMethod method = ctClass.getDeclaredMethod("testRunMethod");
method.insertBefore("System.out.print(\"添加一个方法\");");
///添加一个方法
CtMethod ctMethod = new CtMethod(CtClass.voidType, "runTestRunMethod", new CtClass[]{}, ctClass);
ctMethod.setModifiers(Modifier.PUBLIC);
//调用被代理类的方法
ctMethod.setBody("{ testRunMethod(); }");
ctClass.addMethod(ctMethod);
Object sourceProxy = ctClass.toClass().newInstance();
//运行
Method testRunMethod = sourceProxy.getClass().getDeclaredMethod("testRunMethod");
testRunMethod.invoke(sourceProxy);
}
效果