废话不多说,直接上代码!
1、首先是接口及其实现方法:
package proxy.test;
public interface UserService {
public String getName(int id);
public Integer getAge(int id);
}
package proxy.test;
public class UserServiceImpl implements UserService{
@Override
public String getName(int id) {
System.out.println("getName方法进来了");
return "fuhongyu";
}
@Override
public Integer getAge(int id) {
System.out.println("getAge方法进来了");
return 18;
}
}
2、jdk动态代理的实现:
实现InvocationHandler 接口,重写invoke方法。
package proxy.test;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class MyInvocationHandler implements InvocationHandler{
private Object target;
MyInvocationHandler() {
super();
}
MyInvocationHandler(Object target){
super();
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if("getAge".equals(method.getName())){
System.out.println("before:"+method.getName());
Object result = method.invoke(target, args);
System.out.println("after:"+method.getName());
return result;
}else{
Object result = method.invoke(target, args);
return result;
}
}
}
package proxy.test;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
public class JdkTest {
public static void main(String[] args) {
UserService userService = new UserServiceImpl();
InvocationHandler invocationHandler = new MyInvocationHandler(userService);
UserService userServiceProxy = (UserService)Proxy.newProxyInstance(
userService.getClass().getClassLoader(),
userService.getClass().getInterfaces(),
invocationHandler);
System.out.println(userServiceProxy.getName(1));
System.out.println(userServiceProxy.getAge(1));
}
}
3、cglib动态代理实现:
实现MethodInterceptor接口,重写intercept方法。
package proxy.test;
import java.lang.reflect.Method;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;
public class CglibProxy implements MethodInterceptor{
@Override
public Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
System.out.println("before:"+methodProxy.getSuperName());
System.out.println(method.getName());
Object o1 = methodProxy.invokeSuper(o, args);
System.out.println("after:"+methodProxy.getSuperName());
return o1;
}
}
package proxy.test;
import org.springframework.cglib.proxy.Enhancer;
public class CglibTest {
public static void main(String[] args) {
CglibProxy cglibProxy = new CglibProxy();
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(UserServiceImpl.class);
enhancer.setCallback(cglibProxy);
UserService o = (UserService)enhancer.create();
o.getName(1);
o.getAge(1);
}
}