1.JDK动态代理(JDK的动态代理,对实现了接口的类生成代理)
- 1.1定义接口
public interface Person {
public void eat();
public void sleep();
}
- 1.2实现类
public class Student implements Person {
public void eat() {
System.out.println("吃饭");
}
public void sleep() {
System.out.println("呼呼呼");
}
}
- 1.3创建代理类
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class JDKProxy implements InvocationHandler{
private Person person;
public JDKProxy(Person person){
this.person=person;
}
//创建代理
public Person createJDKProxy(){
Person jdkProxy = (Person) Proxy.newProxyInstance(person.getClass().getClassLoader(),
person.getClass().getInterfaces(), this);
return jdkProxy;
}
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
//对eat方法增强
if("eat".equals(method.getName())){
System.out.println("吃饭前洗手");
return method.invoke(person, args);
}
return method.invoke(person, args);
}
}
- 1.4测试类
import org.junit.Test;
public class SpringTest {
@Test
public void demo1(){
Person person = new Student();
Person jdkProxy = new JDKProxy(person).createJDKProxy();
jdkProxy.eat();
jdkProxy.sleep();
}
}
- 1.5结果如下
吃饭前洗手
吃饭
呼呼呼
2.CGLib动态代理
- 2.1创建目标对象
public class Car {
public void run(){
System.out.println("我把车子开上五环了");
}
}
- 2.2.创建代理类
import java.lang.reflect.Method;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;
public class CGLibProxy implements MethodInterceptor{
private Car car;
public CGLibProxy(Car car) {
super();
this.car = car;
}
//创建代理对象
public Car createCGLibProxy(){
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(car.getClass());
enhancer.setCallback(this);
return (Car) enhancer.create();
}
public Object intercept(Object proxy, Method method, Object[] arg2,
MethodProxy arg3) throws Throwable {
if("run".equals(method.getName())){
System.out.println("上五环先加油");
return arg3.invokeSuper(proxy, arg2);
}
return arg3.invokeSuper(proxy, arg2);
}
}
- 2.3测试类
@Test
public void demo2(){
Car car = new Car();
Car cglibProxy = new CGLibProxy(car).createCGLibProxy();
cglibProxy.run();
}
- 2.4结果如下:
上五环先加油
我把车子开上五环了
Spring框架中如果类实现了接口,就使用JDK的动态代理生成代理对象,如果这个类没有实现任何接口,使用CGLIB生成代理对象.