jdk代理
package com;
public interface Vehicle {
void doSomething();
}
package com;
public class VehicleImpl implements Vehicle{
@Override
public void doSomething() {
System.out.println("vehicle is locomotioning");
}
}
package com;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class JDKDynamicProxy implements InvocationHandler {
private Object target;
public JDKDynamicProxy(Object target) {
this.target = target;
}
public <T> T getProxy() {
System.out.println("----1");
return (T) Proxy.newProxyInstance(
target.getClass().getClassLoader(),
target.getClass().getInterfaces(), this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("vehicle locomotion before");
Object o = method.invoke(target, args);
System.out.println("vehicle locomotion after");
return o;
}
}
package com;
public class JDKDynamicProxyTest {
public static void main(String[] args) {
Vehicle vehicle=new JDKDynamicProxy(new VehicleImpl()).getProxy();
vehicle.doSomething();
}
}
cglib代理
package cl;
public class HelloServiceImpl {
public void sayBey() {
System.out.println("Bye Zhanghao");
}
}
package cl;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
public class HelloMethodInterceptor implements MethodInterceptor {
@Override
public Object intercept(Object o,
Method method,
Object[] objects,
MethodProxy methodProxy)
throws Throwable {
System.out.println("Before: " + method.getName());
Object object = methodProxy.invokeSuper(o, objects);
System.out.println("After: " + method.getName());
return object;
}
}
package cl;
import net.sf.cglib.proxy.Enhancer;
public class Client {
public static void main(String[] args) {
Enhancer enhancer = new Enhancer();
//继承被代理类
enhancer.setSuperclass(HelloServiceImpl.class);
//设置回调
enhancer.setCallback(new HelloMethodInterceptor());
//设置代理类对象
HelloServiceImpl helloService = (HelloServiceImpl) enhancer.create();
//在调用代理类中方法时会被我们实现的方法拦截器进行拦截
helloService.sayBey();
}
}