1.测试类
package com.xxx.pojo;
public class Person {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public void printMsg() {
System.out.println("111111111");
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
2.自定义类加载器
class CustomClassLoader2 extends ClassLoader {
public Class<?> defineClassFromBytes(String className, String path) {
byte[] data = getDataFromPath(path);
return defineClass(className, data, 0, data.length);
}
private byte[] getDataFromPath(String path) {
InputStream is = null;
try {
is = new FileInputStream(path);
byte[] buff = new byte[1024 * 4];
int len = -1;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
while ((len = is.read(buff)) != -1) {
baos.write(buff, 0, len);
}
return baos.toByteArray();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
3.main方法
public class ClassLoaderTest {
public static void main(String[] args) {
String className = "com.xxx.pojo.Person";
String path = "D:\\idea_project\\HelloWorld\\src\\main\\java\\com\\xxx\\pojo\\Person.class";
reload(className, path);
}
public static void reload(String className, String path ) {
new Thread(() -> {
File file = new File(path);
long lastModifiedDate = file.lastModified();
while (true) {
if (lastModifiedDate != file.lastModified()) {
lastModifiedDate = file.lastModified();
CustomClassLoader2 classLoader = new CustomClassLoader2();
Class clazz = null;
try {
clazz = classLoader.defineClassFromBytes(className, path );
Object object = clazz.newInstance();
clazz.getMethod("printMsg").invoke(object);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}).start();
}
}
4.测试方法
- 修改Person.java中printMsg方法的输出结果
- 重新编译class文件:javac.exe .\src\main\java\com\xxx\pojo\Person.java
- 将重新编译好的class文件替换之前的