Forname (名称、实例化、 classLoader)不会将类添加到类路径

By simon at 27 天前 • 0人收藏 • 16人看过

我在产生能量. 爪哇在运行时类文件,并需要利用这些类内的代码即时。 所以我编译了. 爪哇使用编译器 API 创建. 类档案:

Getsystemjavacompiler () ; DiagnosticCollector javafileobject 诊断新的 DiagnosticCollector () ; StandardJavaFileManager compilager (diagnostics,null) ; File new File ("path to File") ; Iterable? 扩展了 JavaFileObject 源代码管理器 getjavaileobjectsfromfiles (Arrays.asList (file)) ; CompilationTask compiler.getask (null,manager,diagnostics,null,sources) ; task.call () ; manager.close () ;

然后,我需要使用(),但如果我只是打电话Forname ("com.foo. 酒吧」)它抛出Classnotfoundexception,假设它是因为新的. 类文件不会被添加到碎屑我查找了将类添加到碎屑在运行时。 我遇到了一些与这个概念有关的模棱两可之处:

1.这种方法(编译. 爪哇文件第一,使用编译器 API,并添加到类加载器在第二步)正确吗? 能够在代码中立即使用类。

图2。有两种方法可以在运行时将类动态加载到类路径中: 一种是使用类加载器,如下所示: (我在编译时遇到了错误,因为它抱怨了这一点)Builtinclasloader没有Adurl方法) :

/ / 获取 ClassLoader 类 ClassLoader cl ClassLoader.getsystemclassloader () ; 类 Clazz cl.getClass () ; / / 从父 URLClassLoader 类方法 clazz.getSuperclass ()中获得受保护的 addURL 方法。 Getdeclaredmethod ("addURL",new Class []{ url.Class }) ; / / Run projected addURL 方法将 JAR 添加到 classpath method.setAccessible (true) ; method.invoke (cl,new Object []{ cls }) ;

另一种方法是使用Forname (名称、实例化、 classLoader)将一个类添加到类路径(这也同时给出了类引用)。 第一个方法我不能应用,因为我得到了一个编译器错误(java11) ,如上所述。 关于第二种方法,Forname (名称、实例化、 classLoader)将新类附加到碎屑如果我们这样调用默认类加载器? :

Forname ("com.foo. Bar",true,ClassLoader.getSystemClassLoader () ; / / 或: Class.forName ("com.foo。 Bar",true,ApiHandler.class.getClassLoader () ;

这对我不起作用。 上述 classLoader 参数的哪个变体是正确的,为什么这些参数不起作用? 是否需要创建一个定制的类加载器并将其传递给()?

图3。我正在做. 爪哇里面的文件Com. foo包装型钢混凝土Eclipse 项目的文件夹。 他们编制的. 类文件也在同一个文件夹中生成(使用编译器 API)。 当我使用 eclipse 刷新项目时(右键单击 project-Refresh). 类文件会在目标 / 类别这时可以通过代码访问类(例如,使用Forname ("com.foo. 酒吧). 但愿如果我生产. 类文件(由编译器 API 提供)目标 / 类别这些类不需要将它们引入类路径就可以识别?


更新:

我能够在我的代码中使用已编译的类,通过保存受尊敬的. 类文件目标 / 类别文件夹,在上面第三个问题中提到)。 (通过加入- d编译器的选项Gettask ()方法:

可迭代的字符串选项 Arrays.asList (new String []{"-d",System.getProperty ("user.dir") +"/ target / classes /"}) ;。 . . Gettask (null,manager,diagnostics,options,null,sources) ; 

通过这种方式,似乎不需要使用 classLoader 将类添加到类路径中; 因为可以使用一个简单的().你怎么解释这个?

同学们 1 Class.forName ("com.foo. 酒吧」) ;

当然,还有通过 ClassLoader 的方式:

类装载器类装载器类装载器类 Loader.loadclass ("com.foo. 酒吧」) ;

登录后方可回帖

Loading...