您的位置:首页 > 编程语言 > Java开发

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() 方法";
}
}


运行结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: