`
qz小峰
  • 浏览: 15188 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
最近访客 更多访客>>
社区版块
存档分类
最新评论
  • sgzlove2007: 如果我要在我的JMX服务中加上一个用户名密码这样的连接限制的话 ...
    JMX

系统类加载器动态加载

JVM 
阅读更多
使用ASM动态编码时,只能获得动态的字节码,但是如果想要让JVM知道,必须要使用加载器来完成.而通常会自定义ClassLoader进行加载.那么如果是系统类加载器加载的类,无法引用自定义加载器加载的类.

那么如果想要ASM生成的字节码,然后通过系统类加载进行加载,那么就没有上面的问题了.

而JVM基于安全考虑,是不允许在未经许可而是用系统类加载器的.在开源项目javassist和ASM中都是通过以下办法来实现用系统类加载器加载动态字节码.

private static Method DEFINE_CLASS;
private static final ProtectionDomain PROTECTION_DOMAIN;
   
static {
        PROTECTION_DOMAIN = (ProtectionDomain)AccessController.doPrivileged(new PrivilegedAction() {
            public Object run() {
                return ReflectUtils.class.getProtectionDomain();
            }
        });
       
        AccessController.doPrivileged(new PrivilegedAction() {
            public Object run() {
                try {
                    Class loader = Class.forName("java.lang.ClassLoader"); // JVM crash w/o this
                    DEFINE_CLASS = loader.getDeclaredMethod("defineClass",
                                                            new Class[]{ String.class,
                                                                         byte[].class,
                                                                         Integer.TYPE,
                                                                         Integer.TYPE,
                                                                         ProtectionDomain.class });
                    DEFINE_CLASS.setAccessible(true);
                } catch (ClassNotFoundException e) {
                    throw new CodeGenerationException(e);
                } catch (NoSuchMethodException e) {
                    throw new CodeGenerationException(e);
                }
                return null;
            }
        });
    }
   
    public static Class defineClass(String className, byte[] b, ClassLoader loader) throws Exception {
        Object[] args = new Object[]{className, b, new Integer(0), new Integer(b.length), PROTECTION_DOMAIN };
        return (Class)DEFINE_CLASS.invoke(loader, args);
    }
分享到:
评论

相关推荐

    类加载器文件

    3. **Application ClassLoader**: 也被称为系统类加载器,负责加载应用程序自身所需的类。这些类通常位于`CLASSPATH`环境变量所指定的位置。同Extension ClassLoader一样,它也是Java实现的类,并继承自`java.lang....

    java类加载器

    获取系统类加载器的父类加载器(扩展类加载器) classLoader = classLoader.getParent(); System.out.println("扩展类加载器--> " + classLoader); // 3. 获取扩展类加载器的父类加载器 // 输出为Null,无法...

    深入Java虚拟机_002_深入详解JVM之类加载器深度剖析、根、扩展及系统类加载器

    开发者编写的大部分Java代码都由系统类加载器加载。 类加载器之间的关系遵循双亲委托模型。当一个类加载器接收到加载类的请求时,它首先会委托父类加载器尝试加载,只有当父类加载器无法加载时,当前类加载器才会...

    自定义类加载器实现自定义加载

    - 类的唯一性:类加载器与类的关系是“一对多”,同一类加载器下的类名必须唯一,不同类加载器加载的同名类不冲突。 - 双亲委派模型的遵守:自定义类加载器通常应遵循双亲委派模型,除非有特殊需求,否则不应轻易...

    Java类加载器原理

    - 系统(System)类加载器:也称为应用程序类加载器,由AppClassLoader实现,加载系统的类路径(CLASSPATH)中指定的类库。 3. 加载器委托加载机制: 类加载器遵循“双亲委派模型”(Delegation Model)。当一个...

    类加载器(java)

    而`log4j`的配置文件可能被不同的类加载器加载,这就需要我们理解类加载器如何查找和加载资源,以及在多层类加载器结构下如何配置和管理`log4j`。 设计模式在类加载器的设计中也扮演着重要角色。例如,使用工厂模式...

    JVM类加载器说明文档

    系统类加载器在加载类时,会先尝试让扩展类加载器加载,如果扩展类加载器无法加载,则再由系统类加载器自己尝试加载。这样的设计是为了保证核心类库的唯一性和安全性,避免用户自定义的类覆盖了 JDK 内置的核心类。 ...

    自定义类加载器

    最后是系统类加载器(也称为应用程序类加载器),负责加载用户类路径(classpath)中的类。 ### 类加载器的工作机制 类加载器遵循“双亲委托模型”进行工作。当一个类加载器接收到加载类的请求时,它首先会委托其...

    类加载器代码

    - **应用程序类加载器(Application ClassLoader)**:也称为系统类加载器,负责加载用户类路径(ClassPath)中的类。 - **自定义类加载器(User-defined ClassLoader)**:用户可以根据需求编写自己的类加载器,...

    Java的类加载器

    不同类加载器加载的相同类会被视为不同的类,即使它们的字节码完全相同。这是实现多版本库共存的基础。 5. 动态加载与插件系统: 类加载器使得在运行时动态加载新类成为可能,这对于构建插件系统或服务发现等场景...

    ClassLoader类加载器

    3. Application ClassLoader:也称为系统类加载器,负责加载用户类路径`-cp`或`-classpath`指定的所有类。 当一个类被加载时,如果它的父类加载器无法加载该类,那么会将任务委派给子类加载器。这就是著名的"委托...

    关于Java类加载器的探讨.pdf

    引导类加载器负责加载jdk中的系统类,扩展类加载器负责加载标准扩展类,而系统类加载器负责加载classpath中的类。 一、类加载器的种类 Java中有三种类加载器:引导类加载器、扩展类加载器和系统类加载器。 1. ...

    自定义Java类加载器

    自定义Java类加载器允许我们根据特定需求扩展默认的加载机制,例如,从非标准位置加载类或者实现动态加载。在Java中,类加载过程分为加载、验证、准备、解析和初始化五个阶段。 首先,让我们了解Java中的默认类加载...

    Java类加载器.pdf

    3. **System ClassLoader(系统类加载器)**:也称为应用程序类加载器,它负责加载用户类路径(ClassPath)上指定的类。 每个类加载器都有其父类加载器,除了启动类加载器没有父加载器。当请求加载一个类时,如果...

    java应用程序类加载器,ClassLoader for java Application

    3. **应用程序类加载器(Application ClassLoader)**:也称为系统类加载器,由sun.misc.Launcher$AppClassLoader实现。它是用户类路径(`classpath`)上的类的主要加载者,可以通过`System.class.getClassLoader()`获取...

    网络类加载器实现

    本篇文章将深入探讨“网络类加载器实现”,这是一个允许从网络上动态加载类的高级技术,对于理解和扩展Java应用程序的灵活性具有重要意义。 首先,我们来了解一下Java类加载的基本过程。类加载分为三个阶段:加载、...

    java的ClassLoader类加载器机制

    在 JVM 运行过程中,类加载器会形成一个层次结构,包括引导类加载器(Bootstrap ClassLoader)、扩展类加载器(Extension ClassLoader)和系统类加载器(System ClassLoader)。 引导类加载器(Bootstrap ...

    黑马程序员------类加载器学习注意点

    但是,如果这个类加载器加载的类还在使用,那么类加载器就无法被回收,这可能会导致资源浪费。因此,设计良好的类加载器应该遵循最小权限原则,尽量避免持久化引用,以防止内存泄漏。 再者,类加载器与JVM的交互是...

Global site tag (gtag.js) - Google Analytics