我已经定义了自己的类加载器,它需要从类路径中读取字节码,增强它并定义类。我最初的实现有一行看起来像这样:
getResourceAsStream(name.replaceAll("\\.", File.separator)+".class");
但我似乎已经成长为黑客。我正在遇到像嵌套子类这样的边界条件,这条线无法正常处理。
正确/可接受的解决方案是什么?
谢谢!
答案 0 :(得分:0)
如果name
是类二进制名称,则资源文件名通常为:
separator + name.replaceAll("\\.", separator) + ".class"
类的binary name是字节码文件中使用的值,由Class.getName()
返回。
请注意,资源名称分隔符不一定与File.separator
相同。例如,如果类加载器是从JAR文件加载的,则分隔符由JAR文件API定义,而不是由文件系统约定定义。
如果您使用嵌套/匿名类的二进制名称,这应该都可以。但是,完全限定类名称到二进制类名称的映射是特定于编译器的,并且不容易自动重现。 (您需要重现编译器用于分配$n
名称组件的方案,并且需要访问源代码。)因此,让您的类加载器理解完全限定名称将很难。但那没关系,因为正常的类加载器不会...
最后,请注意我说“常规”。理论上,你可以实现你想要的任何类文件命名方案,只要你能弄清楚如何一致地进行映射。