概述: jdk动态代理代理的是接口, 根据具体的实现类动态生成接口的实现类
cglib动态代理代理的是类, 根据具体的实现类生成实现类的子类
接口与实现类:
1.接口:IUserService
package proxy;
/**
* @author: lybing
* @create: 2018-04-10-11:24
* @desc: jdk proxy
*/
public interface IUserService {
/**
* method test
*/
void test();
}
2.实现类UserServiceImpl
package proxy;
/**
* @author: lybing
* @create: 2018-04-10-11:25
* @desc: userService implements
*/
public class UserServiceImpl implements IUserService{
@Override
public void test() {
System.out.println("do test...");
}
}
jdk动态代理:
package proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* @author: lybing
* @create: 2018-04-10-11:27
* @desc: jdk proxy
*/
public class JdkProxyUserService implements InvocationHandler{
private Object target;
public JdkProxyUserService(IUserService target) {
this.target = target;
}
public IUserService getProxy(){
return (IUserService) Proxy.newProxyInstance(JdkProxyUserService.class.getClassLoader(),
target.getClass().getInterfaces(), this);
}
@Override
public Object invoke(Object o, Method method, Object[] objects) throws Throwable {
System.out.println("---------BEFORE INVOKE---------");
// 调用者为具体实例对象
Object result = method.invoke(target, objects);
System.out.println("---------AFTER INVOKE---------");
return result;
}
public static void main(String[] args) {
IUserService userService = new UserServiceImpl();
IUserService proxy = new JdkProxyUserService(userService).getProxy();
System.out.println(userService.getClass().getName());
System.out.println(proxy.getClass().getName());
proxy.test();
}
}
cglib动态代理:
package proxy;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
/**
* @author: lybing
* @create: 2018-04-10-11:43
* @desc: cglib proxy
*/
public class CglibProxyUserService implements MethodInterceptor{
private Object target;
public CglibProxyUserService(Object object){
this.target = object;
}
public IUserService getProxy(){
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(target.getClass());
enhancer.setCallback(this);
return (IUserService)enhancer.create();
}
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("=======BEFORE INVOKE======");
// 调用者为具体实例对象
Object result = method.invoke(target, objects);
System.out.println("=======AFTER INVOKE======");
return result;
}
public static void main(String[] args) {
IUserService userService = new UserServiceImpl();
IUserService proxy = new CglibProxyUserService(userService).getProxy();
System.out.println(userService.getClass().getName());
System.out.println(proxy.getClass().getName());
proxy.test();
}
}