编写java脚本:从外部文件导入类

发布于 2024-09-07 01:48:54 字数 334 浏览 7 评论 0 原文

我想导入一个我已经在外部文件夹中编写的类, 例如 : 我的类 Example.java 位于 c:\class\Example.java 中,与我的脚本类似,

var importedClass = new JavaImporter("c:\\class\\Example.java");

或者

importClass("c:\\class\\Example.java");

位于 ScriptEngine rhino 的脚本中
我怎样才能做到这一点???

I want to import a class that I already write in an external folder,
for example :
My class Example.java that is located in c:\class\Example.java to my script like using

var importedClass = new JavaImporter("c:\\class\\Example.java");

or

importClass("c:\\class\\Example.java");

this is in a script for ScriptEngine rhino
how can I do that ???

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

陌生 2024-09-14 01:48:54

我知道您想要:

  1. 编译 Java 源文件
  2. 加载已编译的代码
  3. 在某些 JavaScript 中使用生成的类

javax.tools 包提供了一种编译代码的机制,但如果您不是在 JDK 中运行,ToolProvider.getSystemJavaCompiler() 将返回 null 并且您必须依赖一些其他编译机制(调用外部编译器;嵌入 Eclipse 编译器;等等)。

Java 字节码(.class 二进制文件)可以在运行时通过 类加载器

为了使加载的类对脚本引擎可见,您需要通过 ScriptEngineManager(ClassLoader) 构造函数。


编辑:根据要求

public class HelloWorld {
  public void say() {
    System.out.println("Hello, World!");
  }
}

此脚本只是调用Java反射API来加载并实例化C:\foo\bin目录中的类HelloWorld.class

function classImport() {
  var location = new java.net.URL('file:/C:/foo/bin/');
  var urlArray = java.lang.reflect.Array.newInstance(java.net.URL, 1);
  urlArray[0] = location;
  var classLoader = new java.net.URLClassLoader(urlArray);
  return classLoader.loadClass("HelloWorld");
}

var myClass = classImport();

for(var i=0; i<10; i++) {
  myClass.getConstructor(null).newInstance(null).say();
}

还有更多我确信这是一种优雅的方式。

I understand that you want to:

  1. Compile a Java source file
  2. Load the compiled code
  3. Use the resultant class in some JavaScript

The javax.tools package provides a mechanism for compiling code, though if you're not running in a JDK, ToolProvider.getSystemJavaCompiler() will return null and you'll have to rely on some other compilation mechanism (invoking an external compiler; embedding the Eclipse compiler; etc.).

Java bytecode (.class binaries) can be loaded at runtime via ClassLoaders.

In order for the loaded classes to be visible to your scripting engine, you'll need to provide them via the ScriptEngineManager(ClassLoader) constructor.


EDIT: based on the requirements

public class HelloWorld {
  public void say() {
    System.out.println("Hello, World!");
  }
}

This script just invokes the Java reflection API to load and instantiate a class HelloWorld.class from the C:\foo\bin directory:

function classImport() {
  var location = new java.net.URL('file:/C:/foo/bin/');
  var urlArray = java.lang.reflect.Array.newInstance(java.net.URL, 1);
  urlArray[0] = location;
  var classLoader = new java.net.URLClassLoader(urlArray);
  return classLoader.loadClass("HelloWorld");
}

var myClass = classImport();

for(var i=0; i<10; i++) {
  myClass.getConstructor(null).newInstance(null).say();
}

There are more elegant ways of doing this, I'm sure.

本王不退位尔等都是臣 2024-09-14 01:48:54

我会质疑为什么要这样做。

此处列出的解决方案将起作用。问题是:

  1. 你将得到一个拼凑在一起的东西
    带有反射的解决方案
    很难排除故障。
  2. 您的客户同意吗
    修补代码加载于
    运行时?我工作过的每一个地方
    不是。

I would question why do this.

The solutions listed here will work. The problem is going to be that:

  1. You will have a cobbled together
    solution with reflection that will
    be hard to troubleshoot.
  2. Are your customers Okay with
    patching code that is loaded at
    Runtime ? Everyplace I have worked
    at is not.
杀手六號 2024-09-14 01:48:54

如果我理解正确的话,您实际上想要做的是加载 Java 类,以便您可以(大概)创建实例等。术语是动态加载而不是导入。

Java 允许您使用 ClassLoader.loadClass(String) 方法动态加载字节码文件 (*.class)。关于这个主题有很多资源;例如 JNDI 中的“类加载”页面教程。准备好花一些时间来了解这个主题。特别是,由于您尝试加载不在应用程序的正常类路径上的类,因此您需要创建一个新的类加载器来执行此操作。 java.lang.ClassLoader 类的 Javadoc 为 这里

Java源代码不能直接加载,必须首先使用Java编译器进行编译。如果您使用的是现代 JDK 安装,则可以在运行时调用 Java 编译器。但 JRE 安装不包括 Java 编译器。如果您的平台在运行时有可用的 Java 编译器,则可以通过 ToolProvider 类。再次强调,从正在运行的 Java 应用程序中调用 Java 编译器是很复杂的。

If I understand you correctly, what you are actually trying to do is load Java classes so that you can (presumably) create instances, etcetera. The term for this is dynamic loading not importing.

Java allows you to dynamically load bytecode files (*.class) using the ClassLoader.loadClass(String) method. There are lots of resources on this topic; e.g. the "Class Loading" page from the JNDI tutorial. Be prepared to spend some time getting your head around this topic. In particular, since you are trying to load a class that is not on your application's normal classpath, you will need to create a new classloader to do this. The Javadocs for the java.lang.ClassLoader class are here.

Java source code cannot be directly loaded, but must first be compiled using a Java compiler. If you are using a modern JDK installation, it is possible to call the Java compiler at runtime. But a JRE installation does not include a Java compiler. If your platform has a Java compiler available at runtime, you can access it via the getSystemJavaCompiler() static method of the ToolProvider class. Once again, calling the Java compiler from within a running Java application is complicated.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文