首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ClassLoader definePackage示例

ClassLoader definePackage示例
EN

Stack Overflow用户
提问于 2012-08-20 11:30:44
回答 1查看 913关注 0票数 3

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

我知道ClassLoader有一个definePackage(),它允许您在加载包时将其添加到文件中,但是我在网上找不到这个包的任何示例,我尝试使用以下方法,但它不适合我

代码语言:javascript
复制
definePackage(name, "", "", "", "", "", "", url);
return defineClass(name, classBytes, 0, classBytes.length);

有人知道如何使用definePackage()来完成这个任务吗?

这里是ClassLoader definePackage()的API

EN

回答 1

Stack Overflow用户

发布于 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()中进行的,如下所示:

代码语言:javascript
复制
static Package getPackage(Class<?> c) {
        String name = c.getName();
        int i = name.lastIndexOf('.');
        if (i != -1) {
            name = name.substring(0, i);

你可以看到它去掉了类名。这意味着您需要使用包而不是类名来definePackage。您还需要确保您不会定义一个包不止一次。加在一起看上去就像:

代码语言:javascript
复制
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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12036850

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档