1、object 使用equals时会使用全限定名,其中classloader的名称会在object全限定名中
package cn.xx.user;
import cn.hutool.core.util.StrUtil;
import java.lang.reflect.Field;
public class test {
public static void main(String[] args) throws Exception {
String codePath="C:\\other\\project\\xx-recruit-api\\xx-user-api\\target\\classes\\";
DiyClassLoader diyClassLoader=new DiyClassLoader(codePath);
Class<?> aClass = diyClassLoader.loadClass("cn.xx.user.Student");
Object o = aClass.newInstance();
Field name = aClass.getDeclaredField("name");
name.setAccessible(true);
name.set(o,"小明");
Field age = aClass.getDeclaredField("age");
age.setAccessible(true);
age.set(o,23);
Student student = new Student("小明", 23);
System.out.println(StrUtil.format("A对象{}",o));
System.out.println(StrUtil.format("B对象{}",student));
System.out.println(StrUtil.format("A equals B result:{}",o.equals(student)));
System.out.printf("A对象的加载器:");
System.out.println(o.getClass().getClassLoader());
System.out.printf("B对象的加载器:");
System.out.println(student.getClass().getClassLoader());
}
}
package cn.xx.user;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Student {
private String name;
private Integer age;
}
package cn.xx.user;
import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.IOException;
public class DiyClassLoader extends ClassLoader {
private String codePath;
public DiyClassLoader(ClassLoader parent, String codePath) {
super(parent);
this.codePath = codePath;
}
public DiyClassLoader(String codePath) {
this.codePath = codePath;
}
@Override
protected Class<?> findClass(String name) throws ClassNotFoundException {
BufferedInputStream bis = null;
ByteArrayOutputStream bos = null;
codePath += name.replace('.', '/').concat(".class");
byte[] bytes = new byte[1024];
int line = 0;
try {
bis = new BufferedInputStream(new FileInputStream(codePath));
bos = new ByteArrayOutputStream();
while ((line = bis.read(bytes)) != -1) {
bos.write(bytes, 0, line);
}
bos.flush();
bytes = bos.toByteArray();
return defineClass(null, bytes, 0, bytes.length);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
bis.close();
bos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return super.findClass(name);
}
@Override
protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {
synchronized (getClassLoadingLock(name)) {
Class<?> c = findLoadedClass(name);
if (c == null) {
long t1 = System.nanoTime();
if (name.startsWith("cn")) {
c = this.findClass(name);
} else {
c = this.getParent().loadClass(name);
}
sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);
sun.misc.PerfCounter.getFindClasses().increment();
}
if (resolve) {
resolveClass(c);
}
return c;
}
}
}
在线运行:
https://eaf93591.lightly.teamcode.com/