【问题标题】:Load external classes加载外部类
【发布时间】:2019-07-18 15:57:59
【问题描述】:

我正在尝试在我的项目中加载外部类。 我的想法是加载一个类,然后使用反射来获取它的属性和方法。

我正在尝试这样做,但它不起作用

        Path destination = Paths.get("C:\\Project\\src\\com\\test\\TestLauncher.java");

        URL[] classUrls = new URL[]{ new File(destination.subpath(0, destination.getNameCount()).toString()).toURL() };

        URLClassLoader ucl = new URLClassLoader(classUrls);

        Class<?> beanClass = ucl.loadClass("com.test.TestLauncher");

当您尝试在同一个项目中的文件中使用此代码时,它可以作为一个魅力,但当该类不在同一个项目中时它不起作用,在这种情况下,我收到以下错误:

java.lang.ClassNotFoundException: com.test.FileToLoad at java.net.URLClassLoader.findClass(未知来源)在 java.lang.ClassLoader.loadClass(Unknown Source) 在 java.lang.ClassLoader.loadClass(Unknown Source) 在 urlLoader.Play.main(Play.java:26)

【问题讨论】:

  • 您必须从已编译的.class 文件中加载您的类。
  • 在我的代码中,我使用参数编译它,如下所示: String command = "javac -parameters " + destination.toAbsolutePath().toString();进程 proc = Runtime.getRuntime().exec(command);
  • 这里如何编译Java源文件无关紧要。 destination 变量需要更改为 .class 文件的路径。

标签: java reflection urlclassloader


【解决方案1】:

首先你需要编译.java 文件并尝试加载.class 文件。

你也得到TestLauncher.java文件,但尝试加载com.test.FileToLoad

试试这个:

// path to base directory with classes (exclude packages)
File file = new File("C:\\Project\\target\\classes");
URL[] classUrls = new URL[]{ file.toURI().toURL() };
URLClassLoader ucl = new URLClassLoader(classUrls);
Class<?> beanClass = ucl.loadClass("com.test.TestLauncher");

【讨论】:

  • 你说得对,我稍微清理了代码放在这里,我翻译错了
  • 在我的代码中,我使用参数编译它,如下所示: String command = "javac -parameters " + destination.toAbsolutePath().toString();进程 proc = Runtime.getRuntime().exec(command);我可以在 .java 旁边看到已编译的类
  • 最后一件事,我可以知道使用classLoader项的类的名称(在loadClass方法中使用的那个),我找不到获取它的方法
  • 我意识到它不起作用,它只是起作用了,因为该类在两个包中,我尝试导入的包和我用来获取它的包
  • @DavidMarciel 你能展示一下你的实际工作吗?我在这里输入此代码之前尝试过。
猜你喜欢
  • 2021-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多