JDK动态代理
1.编写接口,提供对外需要被代理的方法 2.编写这个类的实现类,真实被代理的对象 3.编写一个InvocationHandler接口实现类,它里面定义了一个invoke方法调用代理对象时执行具体方法
接口
public interface IHello {
void sayHello(String name);
}
接口实现类
public class HelloImpl implements IHello {
@Override
public void sayHello(String name) {
System.out.println("hello "+name);
}
}
InvocationHandler接口实现类
public class JdkProxy implements InvocationHandler {
private Object target;
public Object binding(Object target){
this.target=target;
return Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("调用之前");
Object res = method.invoke(target, args);
System.out.println("调用之后");
return res;
}
}
测试
public class JProxyTest {
public static void main(String[] args) {
JdkProxy jdkProxy = new JdkProxy();
IHello binding = (IHello) jdkProxy.binding(new HelloImpl());
binding.sayHello("jdk");
}
}
CGLIB动态代理
1.编写真实被代理的对象(类) 2.编写一个MethodInterceptor接口实现类,它里面定义了一个intercept方法调用代理对象时执行具体方法
被代理的对象(类)
public class Person {
public void sayHello(String name) {
System.out.println("Hello " + name);
}
}
MethodInterceptor接口实现类
public class ProxyCglib implements MethodInterceptor {
public Object getPorxy(Class t){
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(t);
enhancer.setCallback(this);
return enhancer.create();
}
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("调用对象之前");
Object o = methodProxy.invokeSuper(o, objects);
System.out.println("调用对象之后");
return o;
}
}
测试
public class TestDemo {
public static void main(String[] args) {
ProxyCglib proxyCglib = new ProxyCglib();
Person porxy = (Person) proxyCglib.getPorxy(Person.class);
porxy.sayHello("kkkk");
}
}



