gpt4 book ai didi

java - 类加载器定义包示例

转载 作者:行者123 更新时间:2023-12-01 18:12:27 25 4
gpt4 key购买 nike

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

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

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

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

Here是类加载器definePackage()的API

最佳答案

看来此信息通常包含在 jar 的 list 中。文档:https://docs.oracle.com/javase/tutorial/deployment/jar/packageman.html

对于您的特定用法,URLClassLoader 会执行相同的操作,只是用 null 代替空字符串,除非存在 list ,所以您的可能没问题: 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

关于java - 类加载器定义包示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12036850/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com