2010-11-28 87 views
0

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

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

但我似乎已经超出了这种破解。我遇到了像嵌套子类一样的边界条件,这条线不能正确处理。

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

谢谢!

+0

资源总是有一个`/`分隔的路径名。 (请参阅http://download.oracle.com/javase/1.4.2/docs/api/java/lang/ClassLoader.html) – dacwe 2010-11-28 10:30:42

回答

0

如果name是类的二进制名称,那么资源文件名通常会是:

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

一类的binary name是在字节码文件中使用的值,并通过Class.getName()返回。

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

您使用二进制名称嵌套/匿名类提供,这应该所有的工作。但是,完全合格的类名到二进制类名的映射是编译器特有的,并且不容易自动重现。 (您需要重现编译器用于分配名称组件的方案,这将需要访问源代码。)因此,让您的类加载器了解完全限定的名称将很困难。不过没关系,因为正常的类加载器不...

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

+0

似乎默认类加载器需要一种方法来识别类。可能有办法利用已有的查找机制? – Jim 2010-11-28 09:21:16