只提供代码,自用
jdk的动态代理:
需要增强的对象必须实现一个接口
package G_proxy_model;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class A_JdkProxy {
public static void main(String[] args) {
final Person p = new Person();
ClassLoader classLoader = p.getClass().getClassLoader();
Class<?>[] interfaces = p.getClass().getInterfaces();
man o = (man)Proxy.newProxyInstance(classLoader, interfaces, new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("what the fuc?");
Object invoke = method.invoke(p, args);
return "1234";
}
});
o.run();
o.eat();
String fuc = o.fuc();
System.out.println(fuc);
/*输出结果:
what the fuck?
man can run
what the fuck?
man can eat
what the fuck?
1234*//
}
}
interface man {
void run();
void eat();
String fuc();
}
class Person implements man{
@Override
public void run() {
System.out.println("man can run");
}
@Override
public void eat() {
System.out.println("man can eat");
}
@Override
public String fuc() {
return "man can fuc";
}
}
基于cglib 的动态代理
cglib 无需继承体系 cglib 直接作为被增强类的父类
package G_proxy_model;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import org.junit.Test;
import java.lang.invoke.MethodHandleInfo;
import java.lang.reflect.Method;
public class B_Cglib_proxy {
public static void main(String[] args) {
final person p1 = new person();
person o = (person) Enhancer.create(p1.getClass(), new MethodInterceptor() {
@Override
public Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
System.out.println("what the fuck??");
Object invoke = method.invoke(p1, args);
return invoke;
}
});
o.eat();
}
//要被代理的类
static class person {
public void eat() {
System.out.println("person can eat");
}
public void run() {
System.out.println("person can run");
}
}
}