java - 如何执行已上传的类的方法?

标签 java reflection classloader

目标是实现一个 Web 应用程序,该应用程序可以执行已上传的 .class 文件的方法。上传的类文件以 byte[] 形式提供。此 .class 文件中的公共(public)类实现了特定接口(interface)。
上传后,我想调用一个方法(接口(interface)实现)。

有没有办法在正在运行的 Java 应用程序中这样做?如果是,如何?

顺便说一句。我知道安全风险。

最佳答案

不应该太难:

  1. 创建您自己的类加载器(不难,见下文)。
  2. 使用 ClassLoader#defineClass(String, byte[], int, int) 加载类.
  3. 检查它实现了您的接口(interface) ( YourInterface.class.isAssignableFrom(loadedClass); )。
  4. Class<?> 上使用 java 反射/自省(introspection)您刚刚进入第 1 步。(例如 YourInterface obj = (YourInterface)loadedClass.newInstance();)。
  5. 调用方法:obj.shinyMethod();

重新创建您自己的类加载器:这是一个简单的类加载器,它只委托(delegate)给系统类加载器:

class MyClassLoader extends ClassLoader {
    public MyClassLoader() {
        super(ClassLoader.getSystemClassLoader());
    }

    // Our custom public function for loading from a byte array,
    // this is here just because defineClass is final, so we
    // can't just make it public. Name can be anything you want.
    public Class<?> loadClassFromByteArray(byte[] data)
    throws ClassFormatError {
        return this.defineClass(null, data, 0, data.length);
    }
}

关于java - 如何执行已上传的类的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11262168/

相关文章:

java - 在 javafx webview 中加载 URL 会导致 JVM 崩溃

c# - 使用反射在 C# 中设置索引属性的值

java - 使用反射更改 boolean 字符串值不起作用

java - 从应用程序类路径加载配置文件

Java 类加载器教程

java - HighCharts 动画安卓

java - Aerospike Java 中的多次写入

java - 来自一个 InputStream 的 2 个 BufferedReader

python - Python 中的反射 : how to view all parameters of a function in Python 2. 7

java - JAR 不在类路径上,强制类加载器从中读取文件