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

Zee*_*mee 2 java reflection classloader

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

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

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

Rom*_*ain 6

不应该太难:

  1. 创建自己的类加载器(不难,见下文).
  2. 使用加载类ClassLoader#defineClass(String, byte[], int, int).
  3. 检查它是否实现了你的接口(YourInterface.class.isAssignableFrom(loadedClass);).
  4. Class<?>在步骤1中使用java reflection/introspection .(例如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);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @Mulmoth:我添加了一个如何创建自己的类加载器的示例,它只是遵循系统类加载器. (2认同)