java 反射机制-学习笔记(7)
2017-11-12 17:28
531 查看
ClassLoader
表 1. ClassLoader 中与加载类相关的方法方法 | 说明 |
---|---|
getParent() | 返回该类加载器的父类加载器。 |
loadClass(String name) | 加载名称为 name的类,返回的结果是 java.lang.Class类的实例。 |
findClass(String name) | 查找名称为 name的类,返回的结果是 java.lang.Class类的实例。 |
findLoadedClass(String name) | 查找名称为 name的已经被加载过的类,返回的结果是 java.lang.Class类的实例。 |
defineClass(String name, byte[] b, int off, int len) | 把字节数组 b中的内容转换成 Java 类,返回的结果是 java.lang.Class类的实例。这个方法被声明为 final的。 |
Class 类提供了一个可以取得ClassLoader 的方法。public ClassLoader getClassLoader()
package cn.lyx.reflact; /** * Created by ShayneLee on 2017/11/12 */ public class ClassLoaderDemo { public static void main(String[] args) { ClassLoader classLoader = ClassLoaderDemo.class.getClassLoader(); System.out.println(classLoader); } }
自定义类加载器
一般来说,自己开发的类加载器只需要覆写 findClass(String name)方法即可。java.lang.ClassLoader类的方法 loadClass()封装了前面提到的代理模式的实现。该方法会首先调用 findLoadedClass()方法来检查该类是否已经被加载过;如果没有加载过的话,会调用父类加载器的 loadClass()方法来尝试加载该类;如果父类加载器无法加载该类的话,就调用 findClass()方法来查找该类。因此,为了保证类加载器都正确实现代理模式,在开发自己的类加载器时,最好不要覆写 loadClass()方法,而是覆写 findClass()方法。新建一个自定义加载器 MyClassLoader:
package cn.lyx.reflact; import java.io.*; public class MyClassLoader extends ClassLoader { private String rootDir; public MyClassLoader(String rootDir) { this.rootDir = rootDir; } protected Class<?> findClass(String name) throws ClassNotFoundException { byte[] classData = getClassData(name); if (classData == null) { throw new ClassNotFoundException(); } else { return defineClass(name, classData, 0, classData.length); } } private byte[] getClassData(String className) { String path = classNameToPath(className); try { InputStream ins = new FileInputStream(path); ByteArrayOutputStream baos = new ByteArrayOutputStream(); int bufferSize = 4096; byte[] buffer = new byte[bufferSize]; int bytesNumRead = 0; while ((bytesNumRead = ins.read(buffer)) != -1) { baos.write(buffer, 0, bytesNumRead); } return baos.toByteArray(); } catch (IOException e) { e.printStackTrace(); } return null; } private String classNameToPath(String className) { return rootDir + File.separatorChar + className.replace('.', File.separatorChar) + ".class"; } }
测试类:
package cn.lyx.reflact; /** * Created by ShayneLee on 2017/11/12 */ public class ClassLoaderDemo1 { public static void main(String[] args) throws Exception { MyClassLoader myClassLoader = new MyClassLoader("C:\\lyxprogramfile\\eclipseWokSpace\\JVMlearn\\out\\production\\JVMlearn"); Class cls = myClassLoader.loadClass("cn.lyx.reflact.Student"); // 取得Class 对象 Object obj = cls.newInstance(); // 对象的实例化 System.out.println(obj); } }
学生类:
package cn.lyx.reflact; /** * Created by ShayneLee on 2017/11/12 */ public class Student { private String name; private Integer age; public Student (){ System.out.println("*****Student 构造方法*****"); } @Override public String toString() { return "Student toString() 方法"; } }
运行结果:
相关文章推荐
- java基础学习笔记——反射机制
- 《Spring 3.x 企业应用开发实战》学习笔记 第三章 IoC容器概述 3.2 相关Java基础知识 类装载器 反射机制
- 黑马程序员——JAVA学习笔记——反射机制(下)
- Effective Java 学习笔记(第53条:接口优先于反射机制)
- Java学习笔记09--反射机制
- JAVA的反射机制学习笔记(一)
- java学习笔记09--反射机制
- 黑马程序员 java学习笔记 Day11:反射机制详解
- JAVA的反射机制学习笔记(二)
- 黑马程序员学习笔记之八(Java 反射机制)
- java学习笔记09--反射机制
- java学习笔记---类型信息(type information)、反射机制与动态代理
- java学习笔记09--反射机制
- Android(java)学习笔记106-1:类的加载器(反射机制)
- 15. JAVA 反射机制 Part 1(Class类、反射、反射机制) ----- 学习笔记
- java学习笔记-反射机制
- 《Spring 3.x 企业应用开发实战》学习笔记 第三章 IoC容器概述 3.2 相关Java基础知识 类装载器 反射机制
- 黑马程序员——JAVA学习笔记——反射机制(上)
- JAVA的反射机制学习笔记(二)
- Java 反射机制-学习笔记