package com;
import java.io.*;
import java.net.*;
import java.util.*;
import java.lang.reflect.Method;
public class CustomClassLoader extends URLClassLoader {
private FileInputStream input = null; //文件输入流
private ByteArrayOutputStream out = null; //字节数组输出流
private String[] url = null; //类文件加载路径
private byte[] data = null; //类文件字节码
private String extensionalName = ""; //类文件扩展名
public CustomClassLoader(URL[] urls) throws Exception{
super(urls);
this.url = new String[urls.length];
for (int i = 0; i < urls.length; i++) {
this.url[i] = urls[i].toURI().toString();
}
}
/*
* 解析URL
*/
private void setFilePath() {
for (int i = 0; i < this.url.length; i++) {
if (this.url[i].substring(0,4).toLowerCase().equals("file") == true) {
this.url[i] = this.url[i].substring(5);
}
}
}
/*
* 获得指定类名(包名+类名)文件的字节码
* @name name String
* @return byte[]
*/
private byte[] getFileData(String name) {
try {
this.setFilePath();
for (String url : this.url) {
String fileName = url + name.replace('.', '/').concat(".") +
this.getExtensionalName();
input = new FileInputStream(new File(fileName));
if (input != null) {
break;
}
}
out = new ByteArrayOutputStream();
data = new byte[1024];
int len = -1;
while ((len = input.read(data)) != -1) {
out.write(data, 0, len);
}
data = out.toByteArray();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (input != null)
input.close();
if (out != null)
out.close();
return data;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}
/*
* 根据指定类名查找类文件
* @param name String
* @return Class
*/
protected Class findClassByName(String name) {
try {
byte[] data = this.getFileData(name);
if (data == null) {
return null;
}
return this.defineClass(name, data, 0, data.length);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/*
* 重写loadClass()方法
* @param name String
* @return Class
*/
public Class loadClass(String name) {
Class c = null;
try {
c = super.loadClass(name);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} finally {
if (c == null) //父类默认方法没有加载到指定类时,使用自定义方法查找
c = this.findClassByName(name);
return c;
}
}
public String getExtensionalName() {
return extensionalName;
}
public void setExtensionalName(String extensionalName) {
this.extensionalName = extensionalName;
}
public static void main(String[] args) throws Exception {
URL[] url = new URL[] {new URL("file:e:/")}; //添加你想要加载类的路径
//网络或本地均可
CustomClassLoader csl = new CustomClassLoader(url);
csl.setExtensionalName("rs");
Class c1 = csl.loadClass("com.demo");
Object obj = c1.newInstance();
Method method = c1.getMethod("printText", null);
method.invoke(obj, null);
}
}
分享到:
相关推荐
自定义类加载器实现自定义加载。自定义类加载器实现自定义加载
3-7Tomcat中自定义类加载器的使用与源码实现(1).mp4
看完一个Java加载原理教程后,写了这个自己的类加载器,作个笔记,以便以且使用
java类加载器学习二、自定义类加载器
Java加壳核心代码,请调试后使用。本资源配合博客进行讲解,博客地址:http://blog.csdn.net/JavaBuilt/article/details/79522837
主要介绍了Java基于自定义类加载器实现热部署过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
3-7Tomcat中自定义类加载器的使用与源码实现(2).mp4
主要介绍了Java实现的自定义类加载器,结合具体实例形式分析了java自定义类加载器的原理与具体实现技巧,需要的朋友可以参考下
JCL是可配置,动态和可扩展的自定义类加载器,可直接从Jar文件和其他来源加载Java类。 这样做的动机是创建隔离的类加载器,该类加载器可以轻松地与IoC框架(如Spring)和Web应用程序集成。 整个库,包括其代码库和...
主要介绍了java自定义类加载器代码示例,具有一定借鉴价值,需要的朋友可以了解下。
ClassLoader的API使用和自定义
本文主要介绍了java 类加载与自定义类加载器。具有一定的参考价值,下面跟着小编一起来看下吧
主要介绍了Java语言中的自定义类加载器实例解析,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
DevLoader.zip tomcat 类加载器
类加载器 以下代码是一个自定义类加载器,它从 jar 文件加载类。
它使用自定义类加载器从Web存档(WAR)中的备用路径或JAR加载类。这有什么用? 考虑一个也应该具有命令行界面的Web应用程序。 当然,您将创建三个模块,并将业务逻辑移至一个模块,并将Web应用程序和CLI移至其他...
自定义Java类加载器demo,自定义了一个classLoader,重写了loadClass 和findClass,注意 loadClass打破了双亲委派机制,所有的类都要在自定义的class文件中找到,而findClass遵循了双亲委派机制
java,自定义加载类的实现。1.自定义加载类的实现。2双亲委派的验证。3如何制定父类加载器。