Java高级进阶:自定义ClassLoader
来源:互联网 发布:linux system函数阻塞 编辑:程序博客网 时间:2024/06/05 15:52
假如我们的类不在classpath下,而我们又想读取一个自定义的目录下的class,如果做呢?
读取自定义目录的类
示例读取c:/test/com/test.jdk/Key.class这个类。
package com.test.jdk;public class Key { private String key = "111111";}
自定义ClassLoader
import org.apache.commons.io.IOUtils;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;public class LocalClassLoader extends ClassLoader { private String path = "c:/test/"; @Override protected Class<?> findClass(String name) throws ClassNotFoundException { Class<?> cls = findLoadedClass(name); if (cls != null) { return cls; } if (!name.endsWith(".Key")) { return super.loadClass(name); } try { InputStream is = new FileInputStream(path + name.replace(".", "/") + ".class"); byte[] bytes = IOUtils.toByteArray(is); return defineClass(name, bytes, 0, bytes.length); } catch (IOException e) { e.printStackTrace(); } return super.loadClass(name); }}
开始读取类
public static void main(String[] args) { try { LocalClassLoader lcl = new LocalClassLoader(); Class<?> cls = lcl.loadClass("com.test.jdk.Key"); Field field = FieldUtils.getField(cls, "key", true); Object value = field.get(cls.newInstance()); System.out.println(value); } catch (Exception e) { e.printStackTrace(); }}
自定义类加载器正常加载到类,程序最后输出:111111
URLClassLoader
上面自定义一个类加载器来读取自定义的目录,其实可以直接使用URLClassLoader就能读取,它已经实现了路径下类的读取逻辑。
public static void main(String[] args) { try { URLClassLoader ucl = new URLClassLoader(new URL[]{new URL("c:/test/")}); Class<?> cls = ucl.loadClass("com.test.jdk.Key"); Field field = FieldUtils.getField(cls, "key", true); Object value = field.get(cls.newInstance()); System.out.println(value); } catch (Exception e) { e.printStackTrace(); }}
推荐阅读
什么是Spring Boot?
Spring Boot开启的2种方式
Spring Boot Starters启动器
Spring Boot定制启动图案
Spring Boot核心配置
Spring Boot功能实战
Spring Boot自动配置原理、实战
Spring Boot Runner启动器
Spring Boot - Profile不同环境配置
看完有没有收获?分享到朋友圈给更多的人吧。
阅读全文
0 0
- Java高级进阶:自定义ClassLoader
- java 自定义ClassLoader
- 自定义 Java ClassLoader
- Java 自定义ClassLoader
- 【Java编程高级进阶】如何使用自定义类型的异常?
- java自定义ClassLoader实例代码
- 自定义classloader加密java程序
- 自定义classloader加密java程序
- ClassLoader进阶
- Java基础(十四) ---- classLoader详细解释及自定义classLoader
- java接口[java7高级进阶]
- 自定义classloader实现JAVA热替换
- java自定义classloader引发的思考
- 自定义ClassLoader
- 自定义ClassLoader
- 自定义ClassLoader
- 自定义ClassLoader
- 自定义ClassLoader
- 高级Java必看的10本书
- 常见的3种Class级别的错误
- 关于Java序列化你应该知道的一切
- fastjson 多级联属性过滤
- Lazy loading NSBundle MobileCoreServices.framework, Loaded MobileCoreServices.framework, System gr
- Java高级进阶:自定义ClassLoader
- hashCode和identityHashCode的区别你知道吗?
- 字符串拼接+和concat的区别
- 调用函数求二维数组中元素和,并统计数组中奇数的个数
- JDK8新特性之接口默认方法与静态方法
- JDK8新特性之Stream流
- JDK8新特性之函数式接口
- JDK8新特性之Lambda表达式
- JDK8新特性之Optional