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

时间:2012-06-29 12:54:03

标签: java reflection classloader

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

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

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

1 个答案:

答案 0 :(得分:6)

不应该太难:

  1. 创建自己的类加载器(不难,见下文)。
  2. 使用ClassLoader#defineClass(String, byte[], int, int)加载课程。
  3. 检查它是否实现了您的界面(YourInterface.class.isAssignableFrom(loadedClass);)。
  4. 在步骤1中使用的Class<?>上使用java reflection / introspection。(例如YourInterface obj = (YourInterface)loadedClass.newInstance();)。
  5. 调用方法:obj.shinyMethod();
  6. 重新创建自己的类加载器:这是一个只委托给系统类加载器的简单加载器:

    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);
        }
    }