从Classpath读取字节码

时间:2010-11-28 06:55:50

标签: java classloader

我已经定义了自己的类加载器,它需要从类路径中读取字节码,增强它并定义类。我最初的实现有一行看起来像这样:

getResourceAsStream(name.replaceAll("\\.", File.separator)+".class");

但我似乎已经成长为黑客。我正在遇到像嵌套子类这样的边界条件,这条线无法正常处理。

正确/可接受的解决方案是什么?

谢谢!

1 个答案:

答案 0 :(得分:0)

如果name是类二进制名称,则资源文件名通常为:

    separator + name.replaceAll("\\.", separator) + ".class"

类的binary name是字节码文件中使用的值,由Class.getName()返回。

请注意,资源名称分隔符不一定与File.separator相同。例如,如果类加载器是从JAR文件加载的,则分隔符由JAR文件API定义,而不是由文件系统约定定义。

如果您使用嵌套/匿名类的二进制名称,这应该都可以。但是,完全限定类名称到二进制类名称的映射是特定于编译器的,并且不容易自动重现。 (您需要重现编译器用于分配$n名称组件的方案,并且需要访问源代码。)因此,让您的类加载器理解完全限定名称将很难。但那没关系,因为正常的类加载器不会...

最后,请注意我说“常规”。理论上,你可以实现你想要的任何类文件命名方案,只要你能弄清楚如何一致地进行映射。