前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >像tomcat容器那样自定义一个 Classloader

像tomcat容器那样自定义一个 Classloader

作者头像
ImportSource
发布2018-04-03 15:39:49
7350
发布2018-04-03 15:39:49
举报
文章被收录于专栏:ImportSourceImportSource

最近本人在写一个service container,需要加载指定的jar。需要自定义一个classloader,可以加载到指定的jar包中的class。

以下是具体实现,其实最核心的就是重写findClass方法。

代码如下:

代码语言:javascript
复制
public class AppClassLoader extends ClassLoader {
 private static Map<String, Class> classes = new HashMap<String, Class>();
 private static AppClassLoader loader;
 
 private String jarName;
 /**
  * @param jarName 
  * @throws Exception
  */
 private AppClassLoader(String jarName) throws Exception {
 this.jarName = jarName;
 init();
 }
 /**
  * 生成或取得AppClassLoader实例
  * @return AppClassLoader
  */
 public static synchronized AppClassLoader getInstance(String jarName) {
 if (loader == null)
 try {
 loader = new AppClassLoader(jarName);
 } catch (Exception e) {
 System.err.println(e.getMessage());
 return null;
 }
 return loader;
 }
 private void init() throws Exception {
 JarInputStream jar = new JarInputStream(new FileInputStream(new File(jarName)));
 JarEntry entry;
 while ((entry = jar.getNextJarEntry()) != null) {
 if (entry.getName().toLowerCase().endsWith(".class")) {
 String classname = entry.getName().substring(0, entry.getName().length() - ".class".length())
 .replace('/', '.');
 byte[] data = getResourceData(jar);
 Class clazz = defineClass(classname, data, 0, data.length);
 classes.put(classname, clazz);
 }
 }
 }
 @Override
 public Class findClass(String name) {
 if (classes.get(name) != null) {
 return classes.get(name);
 }
 return null;
 }
 final static private byte[] getResourceData(JarInputStream jar) throws IOException {
 ByteArrayOutputStream data = new ByteArrayOutputStream();
 byte[] buffer = new byte[8192];
 int size;
 while (jar.available() > 0) {
 size = jar.read(buffer);
 if (size > 0) {
 data.write(buffer, 0, size);
 }
 }
 byte[] val = data.toByteArray();
 data.close();
 return val;
 }
}
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2016-06-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 ImportSource 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档