3

我目前正在为我的应用程序创建一个自定义 ClassLoader,我让类加载器加载类文件,但没有将包添加到类中

我知道 ClassLoader 有一个 definePackage() 可让您在加载包时将包添加到文件中,但我在网上找不到任何示例,我正在尝试使用以下内容,但它不适用于我

definePackage(name, "", "", "", "", "", "", url);
return defineClass(name, classBytes, 0, classBytes.length);

有谁知道如何使用definePackage()做到这一点?

是 ClassLoader definePackage() 的 API

4

1 回答 1

0

看来此信息通常包含在 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;
    }
}

我正在尝试解决类似的问题,发现这有点有趣。显然,进行此调用是子类的责任:http : //www.javaworld.com/article/2076054/core-java/create-a-custom-java-1-2-style-classloader.htmlClassLoader

于 2016-02-11T02:47:05.637 回答