java 如何通过反射修改类的私有方法

网上能找到的都是修改私有变量, 访问私有方法, 我想要修改私有方法, 请问如何操作?

阅读 14.5k
4 个回答

反射是不能修改方法的,但是可以使用修改字节码的方式来实现修改。
使用javassist工具在类加载器加载这个类之前修改他的字节码。
比如修改这个方法的字节码:
org.jboss.resteasy.core.InjectorFactoryImpl.createMethodInjector()

ClassPool pool = new ClassPool(true);
CtClass ct = pool.getCtClass("org.jboss.resteasy.core.InjectorFactoryImpl");// 加载这个类
// 获取被修改的方法
CtMethod m = ct.getDeclaredMethod("createMethodInjector");
m.setBody("return \"已经被修改!\""); // 直接修改方法体
// 转为class
ct.toClass();
// 释放对象
ct.detach();

先上答案:反射只能调用对象的方法,不能修改对象的方法。
也就是说,反射能修改:只有对象的成员变量的值。

反射的目的:是让程序在运行时,能够动态获取或修改对象的所有成员变量,调用对象的所有方法。主要通过java.lang.reflect类库中Filed,Methodhe以及 Constructor三个类来进行操作。通过反射,程序就可以在运行时动态的:

  1. 使用Construcor创建新的对象。
  2. 使用Filedget()set()方法读取和修改对象的成员变量。
  3. 使用Methodinvoke()方法调用对象的方法。

反射修改不了方法,修改用字节码增强技术

反射 在运行时动态调用类的方法,无法修改方法的代码,如要修改方法可以使用字节码增强技术,比如:ASMJava 中提供反射相关的一些方法使用可以参考这个文章:Java 反射机制

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题