`
稻-草
  • 浏览: 62663 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

自定义ClassLoader和反射

    博客分类:
  • Java
阅读更多
package reflect;

import java.io.IOException;
import java.io.InputStream;
import java.nio.ByteBuffer;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;

public class TestClassLoader extends ClassLoader
{
    
    @Override
    protected Class<?> findClass(String name) throws ClassNotFoundException
    {
        InputStream in = null;
        try
        {
            String jarFilePath = "C:/XXXX/omu.jar";
            //String classfile = "com/XXX/ABC.class";
            
            JarFile jarFile = new JarFile(jarFilePath);
            JarEntry entry = jarFile.getJarEntry(name);
            if (entry == null)
            {
                return super.findClass(name);
            }
            in = jarFile.getInputStream(entry); 
            int  size = (int)entry.getSize();
            
            byte[] b = new byte[size];
//            ByteBuffer bytebuffer = ByteBuffer.allocate(size);
            
            int offset = 0;
            while(true)
            {
                
                int length = in.read(b,offset,size-offset);
                offset += length;
                if (offset>=size)
                {
                    break; 
                }
            }
            
            
            return defineClass(name, b, 0, size);
            
        }
        catch (IOException e)
        {
            //throw new ClassNotFoundException(name, e);
            return super.findClass(name);
        }
        finally
        {
            if (in != null)
            {
                try
                {
                    in.close();
                }
                catch (IOException e)
                {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
     
        
    }    

    public static void main(String[] args) throws ClassNotFoundException
    {
        TestClassLoader loader = new TestClassLoader();
        Class<?> classDef = loader.loadClass("com.upgrade.UpgradeMain"); 
        
        System.out.println(classDef);
    }
   
}

 

 

            Class classDefinition = Class.forName(className);
            Object object = classDefinition.newInstance();
            
            Class[] args = new Class[]{int.class, int.class};
            Method m = classDefinition.getMethod("setSize", args );
            
            m.invoke(object, 5, 6); // 调用这个类的setSize(int , int ) 方法

 

 

分享到:
评论

相关推荐

    Java实现热加载完整代码;Java动态加载class;Java覆盖已加载的class;Java自定义classloader

    让Java支持热加载是个不错的想法。如何做到的呢? 1. 定义好接口和实现类 2. 让代理类通过反射的方式调用实现类,对外暴露的是代理类。 3. 自定义URLClassLoader。检查实现类.class文件的...Java自定义classloader;

    使用自定义ClassLoader解决反序列化serialVesionUID不一致问题 _ 回忆飘如雪1

    标题和描述中提到的解决方案是通过自定义`ClassLoader`来处理`serialVersionUID`不一致的问题。以下是几种常见方法的优缺点以及自定义`ClassLoader`的详细解释: 1. **修改序列化byte数据**: 这种方法直接修改已...

    ClassLoader 案例

    自定义ClassLoader允许开发者根据特定需求加载类,比如动态加载或更新类文件,这在某些高级应用场景中非常有用,如插件系统、热部署等。本案例将深入探讨如何创建一个自定义的ClassLoader,利用Java反射和注解技术...

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

    本文主要探讨了Java代码执行漏洞中类动态加载的应用,特别是通过自定义ClassLoader和反射调用`defineClass`方法来实现字节码的动态解析。 首先,Java中类的加载方式有两种:显式加载和隐式加载。隐式加载通常发生在...

    动态生成、编译、运行java文件

    总结起来,动态生成、编译和运行Java文件是Java开发中的高级技巧,它涉及到源代码生成、Java Compiler API、自定义ClassLoader和反射等多个核心概念。理解并熟练掌握这些技术,能够帮助开发者构建更加灵活和强大的...

    Java ClassLoader定制实例

    在实际应用中,我们可以通过反射API来使用自定义ClassLoader加载的类。例如,我们可以创建一个`Class`对象,然后调用`newInstance()`方法来创建该类的实例。 总结来说,Java ClassLoader的定制是一项强大的技术,它...

    ClassLoader类加载机制和原理详解

    但有时我们可能需要打破这种模型,比如实现类的版本控制或插件系统,这时可以通过自定义ClassLoader来实现。 5. 类加载器的关系图 Java中的ClassLoader形成了一个树状结构,Bootstrap ClassLoader位于顶端,其他类...

    ClassLoader总结

    在Spring、OSGi等框架中,ClassLoader扮演着关键角色,如Spring的CGLIB代理机制就涉及到动态生成类,这就需要自定义ClassLoader。 总结来说,对ClassLoader的理解对于Java开发者来说至关重要,它关乎程序的运行...

    深入理解ClassLoader工作机制.docx

    这个过程可以通过自定义ClassLoader来实现,比如从数据库中加载类。 2. **验证**:验证是确保加载的类符合Java语言规范,不会破坏JVM的安全性。它检查字节码的格式、数据流和操作符计算、类和字段的访问控制等。 3...

    ClassLoader

    ClassLoader myLoader = new ClassLoader() { // 创建自定义类加载器 @Override public Class&lt;?&gt; loadClass(String name) throws ClassNotFoundException { // 重写loadClass方法 try { String filename = name...

    【IT十八掌徐培成】Java基础第25天-04.classLoader-系统资源-不可见类访问.zip

    自定义ClassLoader可以让开发者控制类的加载时机和来源,比如从网络、数据库或特定文件夹加载类。但是,这也可能导致类间的不可见性问题,因为每个类加载器都有自己的命名空间。 在“不可见类访问”这个主题中,...

    在Java的反射中,Class.forName和Class

    开发者可以通过自定义ClassLoader来扩展类加载机制,实现动态加载外部类库或网络上的类。自定义ClassLoader通常需要重写`loadClass()`方法,该方法负责查找并加载指定的类。 `Class.forName`和`ClassLoader`的区别...

    Android 插件开发 实例

    在宿主应用中,你需要自定义ClassLoader来解析插件APK的资源和类,当用户触发特定操作时,通过ClassLoader加载并启动插件中的Activity。这个过程中,需要特别注意处理Intent的解析和Activity的生命周期管理,以确保...

    java中classLoader的使用

    不同类加载器加载的类被视为不同的类,不能直接相互访问,但可以通过反射机制实现。 **知识点10:类的唯一性** 同一类加载器加载同一个类只会有一个Class对象,再次加载时会检查内存中是否已有对应Class对象,避免...

    jar包隔离代码.zip

    1. ClassLoader隔离:通过自定义ClassLoader,为每个模块加载特定版本的jar包,确保各模块间的类加载互不影响。 2. OSGi(Open Service Gateway Initiative)框架:OSGi提供了模块化系统,允许在同一JVM中动态加载和...

    防止Java程序源码被人盗用的应用实例.doc

    - 尽管加密和自定义ClassLoader可以增加安全性,但是Java的JVM本身可能存在安全漏洞,允许黑客绕过这些保护措施。因此,还需要结合使用Java的安全管理器和策略文件,限制代码的执行权限,防止恶意代码对系统资源的...

    Android 使用classloader原理进行热更新

    热更新通常依赖于类加载器(Classloader)的工作原理来实现,本篇文章将深入探讨如何利用Android的类加载器实现热更新的机制。 首先,我们需要理解什么是类加载器。在Java和Android中,类加载器是负责查找、加载和...

    Java虚拟机类装载:原理、实现与应用

    自定义ClassLoader时,通常需要重写`loadClass`方法,按照特定逻辑来查找和加载类。这在动态插件系统、热部署和类隔离等场景中非常有用。例如,我们可以创建一个类装载器,专门用于加载网络上的类,或者加载特定目录...

Global site tag (gtag.js) - Google Analytics