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

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

阅读 933
评论 1月5日提问
    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();
    评论 赞赏 1月6日

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

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

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

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

        评论 赞赏 1月7日
          mghio
          • 29

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

          评论 赞赏 1月17日
            撰写回答

            登录后参与交流、获取后续更新提醒