自定义目录标题
package com.example.demo;
import org.junit.Test;
import java.io.*;
import java.net.URL;
import java.net.URLClassLoader;
import java.nio.file.Paths;
import java.util.*;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
public class TestStaticBlock {
@Test
public void test() {
Class<?> class0 = TestStaticBlock.class;
String fileUrlString = new File("D:/mysql-connector-java-8.0.11.jar").toURI().toString();
try {
URL url = new URL(fileUrlString);
System.out.println(class0.getClassLoader() instanceof MyUrlClassLoader);
Class<?> class1 = class0.getClassLoader().loadClass("com.mysql.cj.AbstractPreparedQuery");
ClassLoader classLoader = new MyUrlClassLoader(new URL[]{url});
Class<?> class2 = classLoader.loadClass("com.mysql.cj.AbstractPreparedQuery");
classLoader.loadClass("com.mysql.cj.AbstractPreparedQuery");
System.out.println(class1.getClassLoader());
System.out.println(class2.getClassLoader());
System.out.println(class1.hashCode());
System.out.println(class2.hashCode());
System.out.println(class1.equals(class2));
} catch (Exception e) {
e.printStackTrace();
}
}
public class MyUrlClassLoader extends URLClassLoader{
private Map<String, byte[]> map = new HashMap<>();
public MyUrlClassLoader(URL[] urls) {
super(urls);
initAllJar();
}
@Override
public Class<?> loadClass(String name) throws ClassNotFoundException {
Class<?> c = findLoadedClass(name);
if (c == null) {
byte[] data = map.get(name);
if(name.startsWith("com.mysql.cj") && data != null){
return defineClass(name,data,0,data.length);
}
return super.loadClass(name);
}
return c;
}
public void initAllJar() {
URL[] urls = this.getURLs();
for(URL url:urls){
String path = url.getFile();
if(path.endsWith("jar")){
try {
File jarFile = Paths.get(url.toURI()).toFile();
JarFile jarFileTemp = new JarFile(jarFile);
Enumeration<JarEntry> en = jarFileTemp.entries();
while (en.hasMoreElements()) {
JarEntry je = en.nextElement();
String name = je.getName();
if (name.endsWith(".class")) {
String cls = name.replace(".class", "").replaceAll("/", ".");
InputStream input = jarFileTemp.getInputStream(je);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int bufferSize = 4096;
byte[] buffer = new byte[bufferSize];
int bytesNumRead = 0;
while ((bytesNumRead = input.read(buffer)) != -1) {
baos.write(buffer, 0, bytesNumRead);
}
byte[] cc = baos.toByteArray();
input.close();
map.put(cls, cc);
}
}
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
}