`
xinklabi
  • 浏览: 1591791 次
  • 性别: Icon_minigender_1
  • 来自: 吉林
文章分类
社区版块
存档分类
最新评论

为了实现动态加载而编写的自己的ClassLoader

    博客分类:
  • Java
阅读更多

 

之前客户要求在不重启应用的前提下实现动态增加服务及交易,在网上查了很长时间也没发现类似的技术,最后研究了一下ClassLoader。因为项目是与Spring,一开始我和同事尝试替换源码的class文件,然后调用Spring的refresh()函数刷新上下文,但是发现原来的类没有被新的类替换。于是我看了一下ClassLoader相关的内容,发现默认的系统类加载器加载类后就不会再次加载。然后我想到要定义自己的类加载器,最后可以实现动态替换原来的类了。虽然最后没能应用在项目中,但是初步了解了一下ClassLoader原理让我感觉挺兴奋的,打算以后再做一下深入的研究,先把源码拷贝下来。

class NetClassLoader extends ClassLoader{
 private byte[] bb = null;
 //private String className = null;
 public NetClassLoader(){
  //super();
  super(ClassLoader.getSystemClassLoader().getParent());//让定义的类加载器与默认的系统类加载器平级
 }
 
 public Class<?> loadClass(String name) throws ClassNotFoundException {
  return loadClass(name, false);
 }
// public Class<?> getLoadedClass(String className)throws ClassNotFoundException{
//  Class c = null;
//  
//  FileInputStream fis;
//  try {
//   
//   fis = new FileInputStream("bin\\"+className+".class");
//   int length = 0;
//   length = fis.available();
//   bb = new byte[length];
//   fis.read(bb);
//   fis.close();
//  } catch (FileNotFoundException e) {
//   throw new ClassNotFoundException("所要加载的类的字节码文件不存在");
//  } catch (IOException e) {
//   throw new RuntimeException("加载字节码文件时出错");
//  }
//
//      c = findClass(className);
//      return c;
// }
 protected synchronized Class<?> loadClass(String className, boolean resolve)
 throws ClassNotFoundException
    {
 Class c = findLoadedClass(className);
 FileInputStream fis = null;
 if(c == null){
  try{
   c = super.loadClass(className, resolve);
  }catch(ClassNotFoundException e){
   
   try {
  
    fis = new FileInputStream("bin\\"+className+".class");
    int length = 0;
    length = fis.available();
    bb = new byte[length];
    fis.read(bb);
    fis.close();
   } catch (FileNotFoundException fe) {
    throw new ClassNotFoundException("所要加载的类的字节码文件不存在");
   } catch (IOException ie) {
    throw new RuntimeException("加载字节码文件时出错");
   }
     c = defineClass(className,bb,0,bb.length);//createClass(className);
  }
 }
 if (resolve) {
     resolveClass(c);
 }
     return c;
    }
 
// public NetClassLoader(byte[] b){
//  bb = b;
// }
 public Class createClass(String className){
  Class klass = defineClass(className,bb,0,bb.length);
  if(klass == null)
   System.out.println("是空的");
  return klass;
 }
}
分享到:
评论

相关推荐

    动态加载jar包的实现

    然而,为了实现动态加载,我们需要创建自己的类加载器,例如在描述中提到的`CSClassLoaderUtil`。 `CSClassLoaderUtil`可能是一个实现了`java.lang.ClassLoader`接口的类,它重写了`loadClass()`方法。这个方法通常...

    Java类加载器(ClassLoader)1

    - 实现自定义类加载器时,建议在JDK1.2后重写findClass()方法而非loadClass(),以避免复杂的操作。 **常用方法**: - `getParent()`:返回当前类加载器的父类加载器。 - `forName(String className)`:根据类名动态...

    ClassLoader运行机制 自己写的

    在Java虚拟机(JVM)中,类加载器(ClassLoader)是至关重要的组成部分,它负责查找和加载类...在编写自己的ClassLoader时,需要考虑如何正确实现加载逻辑,以及如何处理类加载的并发问题,确保应用的稳定性和安全性。

    classloader

    这篇文章将深入探讨Android中的类加载器如何实现动态加载其他工程类的过程。 首先,我们需要了解类加载器的基本概念。在Java中,类加载器负责把字节码文件(.class文件)转换为运行时的Class对象。这个过程包括加载...

    Java 动态加载jar文件示例

    在Java编程语言中,动态加载jar文件是一种关键的特性,它允许程序在运行时加载新的类库或组件,而不是在编译时静态地链接。这种技术对于实现插件式开发或者模块化系统至关重要,因为它提供了灵活性和可扩展性。下面...

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

    例如,可以创建自定义类加载器来实现按需加载、隔离不同版本的库,或者实现动态加载插件机制。通过重写`loadClass()`方法,开发者可以控制类的加载过程,实现特定的加载策略。 **多平台选择性配置**: Java的一个...

    java自定义类加载classloader文档,包括代码

    类加载器在Java开发中扮演着极其重要的角色,尤其是在需要实现动态加载类的应用场景下更是不可或缺。 总之,理解和掌握Java类加载器的相关知识对于提高程序设计能力具有重要意义。希望本文能帮助读者更好地理解和...

    定义ClassLoader调用外部jar包

    当这些默认ClassLoader无法满足需求,如加载运行时动态添加的jar包,我们就需要编写自定义ClassLoader。 自定义ClassLoader通常继承自java.lang.ClassLoader基类,并重写其关键方法,如`findClass(String name)`或`...

    Java动态加载与插件开发研究.pdf

    Java语言的动态加载方式和实现插件化的方法是本文的主要研究对象。所谓动态加载,就是在程序运行时加载类或资源,而不是在编译时。Java语言提供了多种动态加载方式,包括隐式加载和显式加载。隐式加载是通过new的...

    Java ClassLoader学习总结

    loadClass 方法是加载类的核心方法,该方法首先检查该 name 指定的 class 是否有被加载,如果没有加载,则委托它的双亲 ClassLoader 进行加载,只有当双亲 ClassLoader 无法加载成功后,才会由自己加载。 在 Java ...

    Java技术----实现JAVA的动态类载入机制

    在Java编程语言中,动态类加载机制是一种强大...通过自定义类加载器和利用反射API,我们可以实现更高级的功能,比如动态加载和执行类,或者在运行时修改对象的行为。这使得Java成为一个高度适应性和可扩展的编程语言。

    lassLoader的关系以及如何防止ClassLoader内存泄漏

    4. 用户自定义类加载器:开发者可以根据需求实现自己的类加载器,例如模块化系统中的模块类加载器。 类加载器之间的关系遵循“双亲委派模型”:当一个类加载器收到加载类的请求时,它首先会委托父类加载器去尝试...

    classloader类加载器_基于java类的加载方式详解

    1. Bootstrap ClassLoader(启动类加载器):这是最顶层的类加载器,由C++编写,是JVM自身的一部分。它负责加载存放在JAVA_HOME/lib目录或-Xbootclasspath参数指定路径下的类库。这个类加载器不是Java类,因此不能...

    详解Android类加载ClassLoader

    自定义ClassLoader在Android开发中并不常见,但有时为了实现动态加载或者热修复等功能,开发者可能需要创建自己的ClassLoader。自定义ClassLoader时,需要重写`loadClass()`、`findClass()`等方法。例如,`loadClass...

    ava的ClassLoader介绍.doc

    在Java 1.2及后续版本中,ClassLoader系统进行了改进,引入了双亲委派模型,即新的类加载请求首先会委托给父ClassLoader尝试加载,只有在父ClassLoader无法加载时,才会尝试自己加载。这样做提高了安全性,避免了类...

    类加载器代码

    - **自定义类加载器(User-defined ClassLoader)**:用户可以根据需求编写自己的类加载器,实现特定的加载逻辑。 3. **双亲委派模型** 类加载器之间存在层次结构,当一个类加载器接收到加载类的请求时,它会先...

    Java调用Groovy,实时动态加载数据库groovy脚本

    总的来说,Java调用Groovy并实时加载数据库中的Groovy脚本是一种强大而灵活的解决方案,特别适用于需要频繁调整业务逻辑或进行热部署的场景。通过结合Java的稳定性和Groovy的动态性,我们可以构建出更适应变化的系统...

Global site tag (gtag.js) - Google Analytics