通过绝对路径在 Java 中导入 class
Import class in Java via absolute path
我一直在尝试通过绝对路径导入 .class,而代码是 运行,但我不知道该怎么做。
我通过 Class.forName();
找到了一种方法来导入 class 当它已经在项目的构建路径中时,但我需要找到一种方法来加载不在构建中的 class路径。
目标是:
- 用户可以上传自己的 .class 文件,然后将其保存在本地的特定文件夹中,路径保存在数据库中
- 通过 GUI 用户可以 select 在代码为 运行
时使用此文件
- 我的代码应该通过这个给定的绝对路径加载 class 而代码是 运行
问题出在第 3 点,因为我不知道是否可以在代码为 运行.
时加载 class
我试过使用 URLClassLoader
,但出现 ClassNotFound 错误。
编辑:
基本上,我有这个静态函数,它的名字应该是 return Class,但是 urlClassLoader.loadClass() 会抛出错误。
文件名是 J48.class 所以对于 className 参数,我尝试使用 "J48","J48.class" 但 none 有效。
此外,我已经尝试设置文件夹 classifiers 来构建路径并将参数设置为 "weka.classifiers.trees.J48",这是包到此 class 的完整路径(包结构是 weka.classifiers.trees).
`public static Class getClassByName(String className) throws MalformedURLException, ClassNotFoundException
{
URLClassLoader urlClassLoader = URLClassLoader.newInstance(new URL[] {
new URL("file:///D:\xampp\htdocs\prog-ing\classifiers\")
});
Class class = urlClassLoader.loadClass(className);
return class;
}`
我想我有一个建议可以解决你的问题...
我知道两个选项:
- 选项 1:从目录中读取 class 文件。
示例:
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
public class Test5 extends ClassLoader {
private static final String PATH = "C://myFiles//";
public static void main(String[] args) {
Class clazz = getClassFromName("Test4");
System.out.println(clazz);
}
private static Class getClassFromName(String className) {
File file = new File(PATH + className + ".class");
try {
FileInputStream fileInputStream = new FileInputStream(file);
byte[] bytes = new byte[fileInputStream.available()];
fileInputStream.read(bytes);
return defineClass(className, bytes, 0, bytes.length);
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}
这将打印如下内容:
class Test4
- 选项 2:从 JAR 中读取 class 文件。
示例:
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
public class Test5 {
private static final String PATH = "C://myFiles//";
public static void main(String[] args) {
Class clazz = getClassFromFile("myJar.jar", "com.mypackage.Test4");
System.out.println(clazz);
}
private static Class getClassFromFile(String fromFile, String className) {
try {
URL url = new URL("file:////" + PATH + fromFile);
URLClassLoader urlClassLoader = URLClassLoader.newInstance(
new URL[] {
url
});
return urlClassLoader.loadClass(className);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
}
return null;
}
}
这将打印如下内容:
class com.mypackage.Test4
请注意,要读取 jar 文件,我必须将 包的完整路径 放入 class 文件。
希望对您有所帮助。
好吧,经过一番思考,我只有一个解决方案(仍然不满意)如下:
用户需要上传的每个 class 都保存到该项目的工作区中,因此我可以使用 Class.forName();
指出这个 "folder" 来获得 class ] 上传 classes,在我的例子中:Class.forName("classifiers.className");
我一直在尝试通过绝对路径导入 .class,而代码是 运行,但我不知道该怎么做。
我通过 Class.forName();
找到了一种方法来导入 class 当它已经在项目的构建路径中时,但我需要找到一种方法来加载不在构建中的 class路径。
目标是:
- 用户可以上传自己的 .class 文件,然后将其保存在本地的特定文件夹中,路径保存在数据库中
- 通过 GUI 用户可以 select 在代码为 运行 时使用此文件
- 我的代码应该通过这个给定的绝对路径加载 class 而代码是 运行
问题出在第 3 点,因为我不知道是否可以在代码为 运行.
时加载 class我试过使用 URLClassLoader
,但出现 ClassNotFound 错误。
编辑:
基本上,我有这个静态函数,它的名字应该是 return Class,但是 urlClassLoader.loadClass() 会抛出错误。
文件名是 J48.class 所以对于 className 参数,我尝试使用 "J48","J48.class" 但 none 有效。
此外,我已经尝试设置文件夹 classifiers 来构建路径并将参数设置为 "weka.classifiers.trees.J48",这是包到此 class 的完整路径(包结构是 weka.classifiers.trees).
`public static Class getClassByName(String className) throws MalformedURLException, ClassNotFoundException
{
URLClassLoader urlClassLoader = URLClassLoader.newInstance(new URL[] {
new URL("file:///D:\xampp\htdocs\prog-ing\classifiers\")
});
Class class = urlClassLoader.loadClass(className);
return class;
}`
我想我有一个建议可以解决你的问题...
我知道两个选项:
- 选项 1:从目录中读取 class 文件。
示例:
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
public class Test5 extends ClassLoader {
private static final String PATH = "C://myFiles//";
public static void main(String[] args) {
Class clazz = getClassFromName("Test4");
System.out.println(clazz);
}
private static Class getClassFromName(String className) {
File file = new File(PATH + className + ".class");
try {
FileInputStream fileInputStream = new FileInputStream(file);
byte[] bytes = new byte[fileInputStream.available()];
fileInputStream.read(bytes);
return defineClass(className, bytes, 0, bytes.length);
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}
这将打印如下内容:
class Test4
- 选项 2:从 JAR 中读取 class 文件。
示例:
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
public class Test5 {
private static final String PATH = "C://myFiles//";
public static void main(String[] args) {
Class clazz = getClassFromFile("myJar.jar", "com.mypackage.Test4");
System.out.println(clazz);
}
private static Class getClassFromFile(String fromFile, String className) {
try {
URL url = new URL("file:////" + PATH + fromFile);
URLClassLoader urlClassLoader = URLClassLoader.newInstance(
new URL[] {
url
});
return urlClassLoader.loadClass(className);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
}
return null;
}
}
这将打印如下内容:
class com.mypackage.Test4
请注意,要读取 jar 文件,我必须将 包的完整路径 放入 class 文件。
希望对您有所帮助。
好吧,经过一番思考,我只有一个解决方案(仍然不满意)如下:
用户需要上传的每个 class 都保存到该项目的工作区中,因此我可以使用 Class.forName();
指出这个 "folder" 来获得 class ] 上传 classes,在我的例子中:Class.forName("classifiers.className");