目标:实现类的动态加载

原理:使用java的自定义classloader机制实现类的动态加载。

代码实现://自定义classloader

public class StrategyClassLoader extends ClassLoader {

//通过该方法实现类的加载

public Class loadStrategyClass(String name) throws FileNotFoundException, IOException {

String classname = name.replace('.', File.separatorChar) + ".class";

InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream(classname);

Class cls = instantiateClass(name, is, is.available());

return cls;

}

@SuppressWarnings("unchecked")

private Class instantiateClass(String name, InputStream fin, long len) throws IOException {

byte[] raw = new byte[(int) len];

try {

fin.read(raw);

} finally {

fin.close();

}

return (Class) defineClass(name, raw, 0, raw.length);

}

}

//类加载器classloader的使用

new StrategyClassLoader().loadStrategyClass("com.xxx.xxxx.DummyStrategy");

注意:该classloader每次都重新读取class文件,实际使用时需要根据自己的需求决定是不是需要缓存。比如可以先检测class文件的时间戳是否变化再确定要不要通过new StrategyClassLoader来重新加载类,否则的话可以使用老的classloader并将之前加载过的class缓存起来以提高性能。

你可以重写loadClass方法来实现目标,但这里我觉得没什么必要。

是不是没更新一次类都要新建立一个classloader?是的,同个classloader中对于相同的类只能加载一次,如果想实现类的不断更新,必须建立新的classloader。

建立这么多的classloader会不会导致内存或者其他资源问题?不会,classloader也只是一个普通的java对象,他一样会被GC垃圾回收掉。所以不用担心太多classloader导致资源不足问题,当然,我们尽可能的减少classloader的创建,毕竟类的加载也是挺耗时的操作。

java 自定义classloader_编写自定义classloader实现类的动态加载相关推荐

  1. java动态加载类 框架_java运用RMI框架类的动态加载不成功

    最近在看<java网络编程精解>,第11章中用RMI动态加载类,可怎么试都不成功,求大神解答 1. 我先在C盘下启动了rmiregistry注册表,如果部署成功注册表应该会从codebas ...

  2. 利用反射实现类的动态加载

    为什么80%的码农都做不了架构师?>>>    //首先定义一个接口来隔离类: public interface Operator { // public java.util.Lis ...

  3. 插件化知识梳理(7) 类的动态加载入门

    一.前言 在 插件化知识梳理(6) - Small 源码分析之 Hook 原理 这一章的学习完成之后,下一步我们将进入插件化加载的精髓,动态加载类的学习,在此之前,我们需要先准备一些关于类加载的知识. ...

  4. JAVA反射机制、Class类及动态加载、成员变量构造方法其他方法的反射与调用、代理模式AOP

    JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法: 对于任意一个对象,都能够调用它的任意一个方法和属性: 这种动态获取的信息以及动态调用对象的方法的功能称为java语言 ...

  5. java动态编译类文件并加载到内存中

    如果你想在动态编译并加载了class后,能够用hibernate的数据访问接口以面向对象的方式来操作该class类,请参考这篇博文-http://www.cnblogs.com/anai/p/4270 ...

  6. Java类的热加载原理与实现

    1 类加载原理 Java类的加载过程主要分为三个步骤,加载.链接.初始化,其中将类加载到JVM中的工作由类加载器完成.在加载阶段,类加载器可以从不同的数据源(jar文件.class文件.网络文件)读取 ...

  7. [JAVA冷知识]动态加载不适合数组类?那如何动态加载一个数组类?

    写在前面 今天和小伙伴分享一些java小知识点,主要围绕下面几点: 既然数组是一个类, 那么编译后类名是什么?类路径呢? 为什么说动态加载不适合数组? 那应该如何动态加载一个数组? 部分内容参考 &l ...

  8. Java反射-静态/动态加载类

    title: Java反射-静态/动态加载类 date: 2019-05-28 18:50:00Java反射-静态/动态加载类 Class 类是对象,是java.lang.Class类的实例对象.任何 ...

  9. spi 动态加载、卸载_理解 ServiceLoader类与SPI机制

    对于Java中的Service类和SPI机制的透彻理解,也算是对Java类加载模型的掌握的不错的一个反映. 了解一个不太熟悉的类,那么从使用案例出发,读懂源代码以及代码内部执行逻辑是一个不错的学习方式 ...

最新文章

  1. python写一个表白程序-用Python写一个表白神器让你脱单
  2. 构造函数不可以是虚函数;析构函数可以是虚函数,也可以是纯虚函数。
  3. 日历记事本java代码_急需日历记事本JAVA源代码
  4. vim 代码提示功能,让vim可以媲美IDE
  5. 信号之sleep函数
  6. 寒武纪讯飞京东等合搞AI芯片评测标准,作者包括陈云霁陈天石
  7. 「软件项目管理」一文详解软件项目进度计划
  8. Mac与Linux SSH无密登陆(互信)
  9. 三维地图下载,3D地图下载,谷歌地球三维地形图查看
  10. 联想正在美丽的海南岛搞个大活动,速看
  11. C++ 重载、重写及其区别
  12. 0xE06D7363: Microsoft C++ Exception.
  13. 帮我用js写一个微信聊天那种气泡效果
  14. 感想篇:7)知其然与知其所以然,KnowHow与KnowWhy
  15. Java中实现十进制数转换为二进制的几种办法
  16. ROS通信机制:话题、服务、参数
  17. 进程间通信的方式(附代码分析)
  18. linux 内核 面试,LINUX内核经典面试题
  19. ARC122E Increasing LCMs
  20. AirPods Pro 2出现随机断连问题,充电仓支持Find My成最大亮点

热门文章

  1. 简约不简单:高级时钟插件Advanced Clock Widget Pro
  2. python中readtext_Python入门 8——数据的读取与写入
  3. Python——雅克比迭代求线性方程组的根
  4. python矩形碰撞检测算法_矩形的碰撞检测(模仿俄罗斯方块)
  5. 【设计模式】状态模式(状态机)
  6. 前端每日实战:119# 视频演示如何用纯 CSS 创作一个接扎啤的动画(内含2个视频)...
  7. 苹果iPad Mini 6 渲染图曝光
  8. 各种投资产品的整理分析(持续更新)
  9. css会对网站排名有影响吗,网站是如何推广的?DIVCSS网页相似太多影响排名?
  10. JS 随机数和不重复的随机数