刘邝杰

导航

Spring第一节

(动态代理:JDK动态代理,GGLIB动态代理)

JDK动态代理

例如饭店是一个接口,中餐店、西餐店、自助餐馆都属于饭店。不管哪种饭店,都会提供饭菜,所以都有提供饭菜的方法,只是提供的饭菜不同。在饭店提供饭菜之前,都需要点餐,在提供饭菜之后,都需要付款。那如何实现,在各种餐厅执行提供饭菜方法的前后执行点餐和付款代码呢?如果后期新增了快餐店,如何自动执行点餐和付款呢?

创建饭店接口类

public interface Restaurant {
void show();
}
创建中餐点,西餐店,自助餐类实现饭店类并重写方法
public class ChineseFood implements Restaurant{
@Override
public void show() {
System.out.println("提供中餐。。。");
}
}
public class WesternFood implements Restaurant{
@Override
public void show() {
System.out.println("提供西餐。。。");
}
}
public class Buffet implements Restaurant{
@Override
public void show() {
System.out.println("提供自助餐。。。");
}
}
创建完成之后,写一个动态助理类实现中转,强化功能
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class DynamicAgent implements InvocationHandler{

private Object object;//动态代理,创建一个你需要代理的对象 ChineseFood

public Object bind(Object object){//object ChineseFood
this.object=object;//this关键字指向本类中的object为传进来的object
return Proxy.newProxyInstance(object.getClass().getClassLoader(),object.getClass().getInterfaces(),this);
//object.getClass().getClassLoader()类加载器,object.getClass().getInterfaces()类接口,this(自己理解(实现类))
}


@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {//重写invoke方法
//proxy是对象,对象为类中的属性 method为类中的方法 args为方法中的形参,因为形参可能不止一个,所以用数组
System.out.println("点菜。。。");
Object result = method.invoke(object, args);//method(方法).invoke(引进)
System.out.println("付款。。。");
return result;
}
}
书写完成之后,写出测试类进行确认
public class Test {
public static void main(String[] args) {
Restaurant r=new ChineseFood();//main方法调用的时候,要使用多态的方法
Restaurant r2 = (Restaurant) new DynamicAgent().bind(r);
r2.show();
}
}




CGLIB动态助理
创建三个类
public class ChineseFood {
void show(){
System.out.println("提供中餐");
}
}

public class WesternFood {
void show(){
System.out.println("提供西餐");
}
}
public class Buffet {
void show(){
System.out.println("提供自助餐");
}
}
编写CGLIB动态助理类
public class DynamicAgent implements MethodInterceptor{

  // 1.DynamicAgent实现MethodInterceptor接口,重写MethodInterceptor intercept方法

// public Object bind(Object object){//3.创建一个方法,形参Object object为传入的类 比如我在测试类创建ChineseFood类时,object就为ChineseFood类
// Enhancer enhancer=new Enhancer();//添加一个(Enhancer)增强器
// enhancer.setSuperclass(object.getClass());
// enhancer.setCallback(this);//给增强器设置一个回调函数
// return enhancer.create();//enhancer.create创建增强器
// }
//
// @Override
// public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
// // 2 .Object o为类的对象也叫属性 Method method为类的方法 Object[] objects为类方法的形式参数
// //MethodProxy methodProxy
//
//
// System.out.println("点餐");
// Object result = methodProxy.invokeSuper(o, objects);
// System.out.println("付款");
// return result;
// }

最后编写测试类进行效果查看
public class Test {
public static void main(String[] args) {
ChineseFood c1=new ChineseFood();
ChineseFood bind = (ChineseFood) new DynamicAgent().bind(c1);
bind.show();
}
}

















posted on 2021-05-18 21:00  刘邝杰  阅读(23)  评论(0编辑  收藏  举报