`
shyboy0358
  • 浏览: 35591 次
文章分类
社区版块
存档分类
最新评论

利用classloader生成class的方法

 
阅读更多
1:无参数构造体
public static Object create(String className) throws ClassLoadException {

        Object object = null;

        Thread t = Thread.currentThread();
        ClassLoader cl = t.getContextClassLoader();

        try {
            object = cl.loadClass(className).newInstance();

        } catch (InstantiationException e) {
            throw new ClassLoadException(e);
        } catch (IllegalAccessException e) {
            throw new ClassLoadException(e);
        } catch (ClassNotFoundException e) {
            throw new ClassLoadException(e);
        }
        return object;
    }

2:有参数的构造方法
public static Object create(String className,
                                 Object[] constructorParameter)
                                 throws ClassLoadException {

        Constructor[] constructors = null;

        Thread t = Thread.currentThread();
        ClassLoader cl = t.getContextClassLoader();

        try {
            constructors = cl.loadClass(className).getConstructors();
        } catch (SecurityException e) {
            throw new ClassLoadException(e);
        } catch (ClassNotFoundException e) {
            throw new ClassLoadException(e);
        }

        for (int i = 0; i < constructors.length; i++) {

            Object object = null;

            try {
             object = constructors[i].newInstance(constructorParameter);
            } catch (IllegalArgumentException e) {
                continue;
            } catch (InstantiationException e) {
                throw new ClassLoadException(e);
            } catch (IllegalAccessException e) {
                throw new ClassLoadException(e);
            } catch (InvocationTargetException e) {
                throw new ClassLoadException(e);
            }

              if (object != null) {
                return object;
            }

        }

        throw new ClassLoadException(
            new IllegalArgumentException("class name is " + className));
    }
分享到:
评论

相关推荐

    ASM操作字节码,动态生成Java类class文件

    当使用CGLIB时,Spring实际上就是在底层利用ASM来生成代理类的字节码。 在ASM中,我们首先需要了解几个核心概念: 1. **ClassWriter**: 这个类负责生成字节码,它是ASM的核心组件之一。通过向ClassWriter发送指令...

    动态编译字符串成java,并且添加class到jvm

    默认的`ClassLoader`无法加载内存中的`.class`,所以我们需要自定义一个`ClassLoader`,覆盖`findClass()`方法,从内存中读取`.class`字节码。 8. **创建并执行实例**: 使用`Class.forName()`加载类后,可以调用`...

    深入理解ClassLoader工作机制.docx

    1. **加载**:加载是ClassLoader工作的起点,它从文件系统或网络中找到类的二进制数据,然后创建一个对应的Class对象。这个过程可以通过自定义ClassLoader来实现,比如从数据库中加载类。 2. **验证**:验证是确保...

    Java Classloading Mechanism : ClassLoader & ASM & 动态字节码增强

    4. 调用ClassWriter的finish()方法生成字节码。 5. 将生成的字节码传递给ClassLoader,由其加载到JVM。 动态字节码增强是一种常见的优化和扩展技术,例如,Spring AOP就是通过字节码增强实现的。它可以在不修改原有...

    classloader-study.zip

    1. **查找类文件**:当需要加载一个类时,`ClassLoader`会根据类名生成对应的`.class`文件路径。 2. **读取字节码**:找到类文件后,`ClassLoader`将其内容读取为字节数组。 3. **验证与准备**:JVM验证字节码的正确...

    jvm 加载class文件

    Java作为一种动态性极强的解释型编程语言,在程序运行时,Java虚拟机(JVM)负责将编译生成的`.class`文件加载到内存中进行执行。在Java环境中,每个类(Class)以及接口(Interface)都会对应一个`.class`文件,...

    ClassLoader in OSGI

    经过编译后,生成的`.class`文件可以在JVM上执行。在这个过程中,类装载器(ClassLoader)扮演着关键角色,其主要职责是根据程序的需求动态地加载这些`.class`文件到JVM中。 #### 二、ClassLoader体系结构 类装载...

    深入java虚拟机(七)深入源码看java类加载器ClassLoader 1

    这通常涉及到从文件系统或网络中读取.class文件,或者通过动态生成的方式获取字节码。 2. 验证(Verification):确保加载的字节码符合Java语言规范,不包含恶意代码,不会对JVM造成危害。 3. 准备(Preparation)...

    深入了解JavaClassLoader,Bytecde.pdf

    - **findClass方法**:这个新方法被`loadClass`的默认实现调用,用于实际查找类。 - **getSystemClassLoader**:提供了一个接口来获取系统ClassLoader的实例,使得访问变得更加直接。 - **getParent方法**:允许...

    Java代码执行漏洞中类动态加载的应用1

    在例子中,创建了一个名为`U`的类,它继承自ClassLoader,并定义了一个`g`方法,该方法接受一个字节数组作为参数,然后调用父类的`defineClass`方法动态解析字节码,返回一个Class对象。通过这个Class对象,可以...

    JVM之用Java解析class文件共10页.pdf.zi

    一个Java源文件被编译后会生成对应的class文件,这是Java字节码的载体。class文件由一系列有序的字节构成,这些字节按照特定的格式编码,包括魔数、版本号、常量池、访问标志、类索引、父类索引、接口索引集合、字段...

    Dynamic Class Loading in the Java Virtual Machine

    - 在Java堆中生成对应的`java.lang.Class`对象,作为方法区这些数据的访问接口。 #### 动态类加载的典型应用场景 1. **网络应用**:Web应用中经常需要动态下载和执行代码,如Applet,这是一种典型的动态加载场景。...

    在java中利用动态编译实现eval

    Class&lt;?&gt; dynamicClass = classLoader.loadClass("Temp"); // 获取并执行方法 Method method = dynamicClass.getMethod(methodName); Object result = method.invoke(null); System.out.println(result); } }...

    java反射机制

    2. **`Class`对象的生成方式**: - 对于每个类而言,JRE都为其保留了一个不变的`Class`类型的对象。 - `Class`对象只能由系统建立对象。 - 一个类在JVM中只会有一个`Class`实例。 #### 三、获取`Class`对象的...

    尚硅谷_佟刚_Java基础_反射.pdf

    ClassLoader类提供了多种方法来加载类,例如使用loadClass()方法加载类、通过findClass()方法查找类、使用defineClass()方法定义类等。此外,ClassLoader类还有获取类加载器对象和获取父类加载器的方法。通过...

    【Java基础笔记】反射.docx

    通过`ClassLoader`加载,如`Class clazz = classLoader.loadClass("全限定类名");`。 在实际应用中,反射常用于框架开发、插件系统、单元测试等方面。然而,由于反射降低了代码的编译时安全性,增加了程序的复杂性...

    android运行时生成dex文件

    4. 使用DexClassLoader的`loadClass()`方法加载新的类,并实例化或调用其方法。 这样的技术虽然强大,但也有一些挑战,比如安全问题、性能影响以及兼容性问题。因此,开发者必须谨慎使用,并确保遵循Android的最佳...

    Variant Configuration: Class Node

    例如,静态分析工具可能会遍历这些节点来查找潜在的代码问题,而编译器则会使用这些节点来生成最终的.class文件。 当我们谈论“Variant Configuration”与类节点的结合时,这通常意味着在不同的运行时环境中,类...

Global site tag (gtag.js) - Google Analytics