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文件替换之前的