2

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

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

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

4

1 回答 1

6

不应该太难:

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

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

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);
    }
}
于 2012-06-29T12:57:41.590 回答