我目前正在为我的应用程序创建一个自定义的ClassLoader,我让类加载器加载类文件,但是没有将包添加到类中。
我知道ClassLoader有一个definePackage(),它允许您在加载包时将其添加到文件中,但是我在网上找不到这个包的任何示例,我尝试使用以下方法,但它不适合我
definePackage(name, "", "", "", "", "", "", url);
return defineClass(name, classBytes, 0, classBytes.length);有人知道如何使用definePackage()来完成这个任务吗?
这里是ClassLoader definePackage()的API
发布于 2016-02-11 02:47:05
该信息似乎通常包含在jar的清单中。文档:https://docs.oracle.com/javase/tutorial/deployment/jar/packageman.html
至于您的特定用法,URLClassLoader也会执行相同的操作,除非使用空字符串替换空字符串,除非存在清单,所以您的清单可能是可以的:http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/net/URLClassLoader.java#261。
但是,您使用的是包名的类名,这是行不通的。查找是在Class.getPackage()中进行的,如下所示:
static Package getPackage(Class<?> c) {
String name = c.getName();
int i = name.lastIndexOf('.');
if (i != -1) {
name = name.substring(0, i);你可以看到它去掉了类名。这意味着您需要使用包而不是类名来definePackage。您还需要确保您不会定义一个包不止一次。加在一起看上去就像:
private static void yourMethod() {
String packageName = getPackageName(name);
if (packageName != null && getPackage(packageName) == null) {
definePackage(getPackageName(name), null, null, null, null, null, null, null);
}
}
private static String getPackageName(String className) {
int i = className.lastIndexOf('.');
if (i > 0) {
return className.substring(0, i);
} else {
// No package name, e.g. LsomeClass;
return null;
}
}我试图解决一个类似的问题,发现这有点有趣。显然,ClassLoader子类有责任调用:http://www.javaworld.com/article/2076054/core-java/create-a-custom-java-1-2-style-classloader.html
https://stackoverflow.com/questions/12036850
复制相似问题