当前位置: 首页 > 面试题库 >

Java:如何将存储为byte []的Class加载到JVM中?

阳英朗
2023-03-14
问题内容

如果已经将整个.class文件序列化为byte [],并假定该类的名称已知(与byte []一起传递),则如何转换byte []->
Class->然后将其加载到JVM,以便以后可以通过调用Class.forName()使用它?

注意: 之所以这样做,是因为我将.class发送到另一台主机,而主机的JVM不知道此.class。


问题答案:

我现在在测试中实际上正在使用类似的方法,将一组类定义作为byte []给予ClassLoader:

  public static class ByteClassLoader extends URLClassLoader {
    private final Map<String, byte[]> extraClassDefs;

    public ByteClassLoader(URL[] urls, ClassLoader parent, Map<String, byte[]> extraClassDefs) {
      super(urls, parent);
      this.extraClassDefs = new HashMap<String, byte[]>(extraClassDefs);
    }

    @Override
    protected Class<?> findClass(final String name) throws ClassNotFoundException {
      byte[] classBytes = this.extraClassDefs.remove(name);
      if (classBytes != null) {
        return defineClass(name, classBytes, 0, classBytes.length); 
      }
      return super.findClass(name);
    }

  }


 类似资料:
  • 问题内容: 我阅读了JVM内存模型,并对以下内容感到困惑: JVM是否将.class实例存储在其内存中。如果是,则在哪个区域。 就像在加载类后,JVM生成了机器级代码,然后开始执行机器代码指令,然后仅在堆上创建对象,并填充了方法区域。 perm gen等区域存储字节码还是机器级代码? 烫发与方法面积 我真的很感谢您对此主题的任何帮助。 谢谢。 问题答案: 1)文件将在加载时存储在permgen存储

  • 除了这些地方之外,hostspot JVM进程还在哪里存储内存: 烫发 终身制发电 伊甸园空间 从空间 到空间 代码缓存 也就是说:热点进程可以保留哪些可能的方式 我能想到的一些答案(让我知道这些是不是真的): 用于线程栈的虚拟内存没有用这些数字表示 任何加载的dll或文件。 编辑: 给出的一些其他答案: Java.exe本身 JNI方法可以分配内存本身 任何本机代码(例如来自DLL)都可以分配内

  • 下面是我的代码: 这是我的适配器:

  • 问题内容: 嗨,我想知道我可以根据我的应用程序增加JVM的内存。如果是,如何增加JVM的内存?我怎么知道JVM的大小? 问题答案: 启动JVM时,可以调整两个参数以适合你的内存需求: 指定初始Java堆大小,并 最大Java堆大小。 http://www.rgagnon.com/javadetails/java-0131.html

  • 堆栈:使用Ambari 2.1安装HDP-2.3.2.0-2950我正在执行以下步骤: 使用SQOOP将SQL server表加载到HDFS 在配置单元中创建外部表 在Sqoop导入中找不到相关的charset/nvarchar等选项 在配置单元中,是否可以盲目使用varchar/string代替nvarchar