繁体   English   中英

如何从类路径(作为字节数组)加载Java类以进行字节码注入?

[英]How to load a Java class from the classpath *as a byte array* for bytecode injection?

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

我想仪器JVM有javaagent交换MyBadClassMyGoodClass ,这也是在类路径中。

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
        }
      }
    });
  }
}

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

你可以得到一个InputStream与

loader.getResourceAsStream(name + ".class");

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

你基本上想

  • 首先扫描您的类路径(请参阅此处获取想法)
  • 您基本上在“找到” MyGoodClass时就停止了-理想情况下,扫描过程的结果是某种句柄 ,使您可以访问属于该类的文件

如果您的类路径仅包含目录名称,那将非常简单-但也许您的类位于某个JAR中,然后需要做更多的工作。

但正如所说:核心是最初的“扫描”。 那是一个(某种程度上)解决的问题,它只需要“工作”就可以完成。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM