使用 运行代码时,java 仅使用 JAR 文件清单中定义的类路径(即 属性)。如果类位于 中,或者该类位于 JAR 清单的属性中设置的类路径中,则可以使用以下代码段加载该类,其中 的 是完全限定的类名。java -jar app.jar
Class-Path
app.jar
Class-Path
className
final String classAsPath = className.replace('.', '/') + ".class";
final InputStream input = ClassLoader.getSystemResourceAsStream( path/to/class );
现在,如果类不是 JAR 的一部分,并且不在清单的 中,则类装入器将无法找到它。相反,您可以谨慎使用 ,来处理 Windows 和 Unix/Linux/MacOSX 之间的差异。Class-Path
URLClassLoader
// the class to load
final String classAsPath = className.replace('.', '/') + ".class";
// the URL to the `app.jar` file (Windows and Unix/Linux/MacOSX below)
final URL url = new URL( "file", null, "///C:/Users/diffusive/app.jar" );
//final URL url = new URL( "file", null, "/Users/diffusive/app.jar" );
// create the class loader with the JAR file
final URLClassLoader urlClassLoader = new URLClassLoader( new URL[] { url } );
// grab the resource, through, this time from the `URLClassLoader` object
// rather than from the `ClassLoader` class
final InputStream input = urlClassLoader.getResourceAsStream( classAsPath );
在这两个示例中,您都需要处理异常,以及输入流是在找不到资源的情况下的事实。另外,如果你需要进入一个,你可以使用Apache的共享资源。而且,如果您随后想要 一个 ,则可以使用类装入器的方法,该方法接受 .null
InputStream
byte[]
IOUtils.toByteArray(...)
Class
defineClass(...)
byte[]
您可以在 Diffusive 源代码的 ClassLoaderUtils
类中找到此代码,该源代码可以在 SourceForge 上找到,github.com/robphilipp/diffusive
以及一种从 RestfulDiffuserManagerResource.createJarClassPath(...)
中的相对和绝对路径为 Windows 和 Unix/Linux/MacOSX 创建 URL 的方法。