如何从类路径*加载Java类作为字节数组*用于字节码注入?

时间:2018-02-06 16:33:21

标签: java classloader bytecode instrumentation javaagents

我的Java类路径中有一个类com.mycompany.MyBadClass

我正在尝试使用javaagent来检测JVM以交换MyBadClass MyGoodClass,这也是在类路径中。

public static class BugFixAgent {
  public static void premain(String args, Instrumentation inst) {
    inst.addClassFileTransformer(new ClassFileTransformer() {
      @Override
      public byte[] transform(ClassLoader loader, 
                              String className, 
                              Class<?> classBeingRedefined, 
                              ProtectionDomain protectionDomain, 
                              byte[] classfileBuffer) {
        if (className.equals("com/mycompany/MyBadClass")) {
          return patchedClassAsByteArray; // <====== ??????
        } else {
          return null; // skips instrumentation for other classes
        }
      }
    });
  }
}

所以我的问题是:如何以编程方式从类路径加载byte array com.mycompany.MyGoodClass

2 个答案:

答案 0 :(得分:2)

您可以使用

获取InputStream
loader.getResourceAsStream(name + ".class");

然后可以将其转换为字节数组。

答案 1 :(得分:0)

你基本上想要

  • 首先扫描您的类路径(请参阅here了解相关信息)
  • 当你发现&#34;&#34; MyGoodClass - 理想情况下扫描过程的结果是某种句柄,允许您访问属于该类的文件

如果您的类路径只包含目录名称,那很容易 - 但是也许您的类位于某个JAR中,然后需要更多工作。

但正如所说:核心问题是最初的&#34;扫描&#34;。这是一个(有点)解决的问题,它只需要工作&#34;完成。