第一步; 定义自己的类加载器
import java.net.URL;
import java.net.URLClassLoader;
public class MyClassLoader extends URLClassLoader{
public MyClassLoader(URLClassLoader urlClassLoader) {
super(urlClassLoader.getURLs(),urlClassLoader);
}
public Class<?> defineClassByByteArray(String className, byte[] bytes){
return this.defineClass(className, bytes, 0, bytes.length);
}
}
定义一个简单的PO:
public class User {
private String name;
private String age;
private String address;
@Override
public String toString() {
return "User [name=" + name + ", age=" + age + ", address=" + address
+ "]";
}
public void call(){
System.out.println("User");
}
}
测试类
import java.net.URLClassLoader;
import javassist.CannotCompileException;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;
import javassist.NotFoundException;
public class Client {
private final static MyClassLoader CLASS_LOADER = new MyClassLoader(
(URLClassLoader) Client.class.getClassLoader());
public static void main(String[] args) {
try {
CtClass ctClass = ClassPool.getDefault().get("chenbyan.User");
CtMethod cm = ctClass.getDeclaredMethod("call");
//植入代码
<span style="white-space:pre"> </span>cm.insertAfter("System.out.println(\"hahahah\");");
byte[] bytes = ctClass.toBytecode();
<span style="white-space:pre"> </span>//加载新代码
Class<?> myuser = CLASS_LOADER.defineClassByByteArray(
"chenbyan.User", bytes);
Object object = myuser.newInstance();
myuser.getMethod("call").invoke(object);
} catch (Exception e) {
e.printStackTrace();
}
/*
* String path = Client.class.getResource("").getPath();
*
* System.out.println(path);
*/
}
}