- 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);
- }
- }
自定义类加载器
最新推荐文章于 2024-05-14 08:53:32 发布