gpt4 book ai didi

Java URLClassLoader 无法识别字符串

转载 作者:搜寻专家 更新时间:2023-11-01 01:13:31 27 4
gpt4 key购买 nike

我有一个非常奇怪的问题。

我正在使用 URLClassLoader 从目录中动态导入文件。如果我使用文字字符串,代码可以正常工作,如果我将变量用于文字字符串,代码也可以正常工作,但这不是我需要的。

package test;

import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;

public class Test {
public static void main(String[] args) {

try {
File subfolder = new File("C:\\temp\\");
URL classUrl = subfolder.toURI().toURL();
URL[] classUrls = { classUrl };
URLClassLoader ucl = new URLClassLoader(classUrls);

for (File f : subfolder.listFiles()) {

String name = f.getName()
.substring(0, f.getName().lastIndexOf(".")).trim();
if (name.equals("TestClass"))
System.out.println(name);
try {
MyInterface de = (MyInterface) Class.forName("TestClass", true, ucl)
.newInstance();
de.printSomething();
} catch (ClassNotFoundException e) {
}

ucl.close();

}
} catch (MalformedURLException e) {
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

我需要的是能够做到这一点:

MyInterface de = (MyInterface) Class.forName(name, true, ucl).newInstance();

但即使“name”是一个有效的字符串并且等于“TestClass”,它也不起作用。

编辑:我得到错误:

java.lang.ClassNotFoundException: TestClass
at java.net.URLClassLoader$1.run(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Unknown Source)
at test.Test.main(Test.java:25)

怎么了?

最佳答案

我猜这是因为 for 循环中的 ucl.close()。如果有目录,我添加了一些测试:如果在根包中声明,则以下类工作并实例化自身,如果 eclipse 配置为在“bin”目录中生成 .class 文件:

public class Toto {

public Toto(){
// this writes "Toto" in the console if the class is well instanciated
System.out.println("Toto");
}

public static void main(String[] args) {
try {
File subfolder = new File("bin");
URL classUrl = subfolder.toURI().toURL();
URL[] classUrls = { classUrl };
URLClassLoader ucl = new URLClassLoader(classUrls);

for (File f : subfolder.listFiles()) {
String fileName= f.getName();
int suffix = fileName.lastIndexOf('.');
if(f.isDirectory() || suffix==-1){
continue;
}
String name = fileName.substring(0, suffix);
try {
Class.forName(name, true, ucl).newInstance();

} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
ucl.close();
} catch (MalformedURLException e) {
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}

关于Java URLClassLoader 无法识别字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15183792/

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