目录
一、类
二、类型信息的存储与装载
1. 预先加载(类内部、类外部)
2. 按需加载
3. 自定义加载(存疑)![](https://i-blog.csdnimg.cn/blog_migrate/ec5bca7fb045434f66a6d968462c2afd.png)
代码段:
package customLoader;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
/**
* @author: y9
* @Date: 2021/09/26
*/
public class FileSystemClassLoader extends ClassLoader{
private String rootDir;
public FileSystemClassLoader(String rootDir) {
this.rootDir = rootDir;
}
@Override
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);
System.out.println(path);
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 + "\\" + className + ".class";
return rootDir + File.separatorChar + className.replace('.',File.separatorChar) + ".class";
}
}
package customLoader;
/**
* @author: y9
* @Date: 2021/09/26
*/
public class Sample {
private Sample instance;
public void setSample(Object newInstance) {
this.instance = (Sample)newInstance;
}
}
package customLoader;
import java.lang.reflect.Method;
/**
* @author: y9
* @Date: 2021/09/26
*/
public class FileSystemClassLoaderTest {
public static void main(String[] args) {
new FileSystemClassLoaderTest().testClassIdentity();
}
private void testClassIdentity() {
String classDataRootPath = "D:\\java\\Studentsa\\bin\\customLoader";
FileSystemClassLoader fscl1 = new FileSystemClassLoader(classDataRootPath);
FileSystemClassLoader fscl2 = new FileSystemClassLoader(classDataRootPath);
String className = "Sample";
try {
Class<?> class1 = fscl1.loadClass(className);
Object obj1 = class1.newInstance();
Object obj3 = class1.newInstance();
Class<?> class2 = fscl2.loadClass(className);
Object obj2 = class2.newInstance();
Method setSampleMethod =
class1.getMethod("setSample", java.lang.Object.class);
setSampleMethod.invoke(obj1,obj3);
setSampleMethod.invoke(obj1, obj2);
}catch (Exception e) {
e.printStackTrace();
}
}
}