2、Java 动态代理

1、jdk动态代理

面向接口,必须有接口和实现类,增强接口中定义的方法,只能读取接口中方法上的注解


public class Test02JDKProxy {
    public static void main(String[] args) {

        final Dinner d = new Human("张三");

//        ClassLoader loader,
        ClassLoader classLoader = d.getClass().getClassLoader();
//        Class<?>[] interfaces,
        Class<?>[] interfaces = d.getClass().getInterfaces();
//        InvocationHandler h
        InvocationHandler h = new InvocationHandler() {

            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                Object invoke;
                if ("eat".equals(method.getName())) {
                    System.out.println("饭前洗手");
                    invoke = method.invoke(d, args);
                    System.out.println("饭后洗碗");
                } else {
                    invoke = method.invoke(d, args);
                }
                return invoke;
            }

        };
        Dinner proxyDinner = (Dinner) Proxy.newProxyInstance(classLoader, interfaces, h);
        proxyDinner.eat("包子");
//        proxyDinner.drink();


    }


}


interface Dinner {
    void eat(String food);

    void drink();
}

class Human implements Dinner {
    private String name;

    public Human(String name) {
        this.name = name;
    }

    public void eat(String food) {
        System.out.println(name + ",正在吃" + food);
    }

    public void drink() {
        System.out.println("正在喝茶");
    }
}

class Student implements Dinner {
    private String name;

    public Student(String name) {
        this.name = name;
    }

    public void eat(String food) {
        System.out.println(name + ",正在食堂吃" + food);
    }

    public void drink() {
        System.out.println("正在喝可乐");
    }
}


2、cglib动态代理

面向父类 动态的生成子类

public class Test03CglibProxy {
    @Test
    public void testCglibProxy() {
        Person person = new Person();

        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(person.getClass());
        enhancer.setCallback(new MethodInterceptor() {
            public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
                /*
                Object o 生成之后的代理对象 personProxy,
                Method method 父类中原本执行的方法 Person --> eat() ,
                Object[] objects 方法在调用时 传入的实参数组,
                MethodProxy methodProxy 子类中重写父类的方法 personProxy >>> eat()
                */

                Object invokeSuper;

                if ("eat".equals(method.getName())) {
                    // 对方法进行增强
                    System.out.println("吃饭前洗手");
                    // 子类对象方法在执行,默认会调用父类对应被重写的方法
                    invokeSuper = methodProxy.invokeSuper(o, objects);
                    System.out.println("吃饭后洗碗");
                } else {
                    // 正常执行
                    invokeSuper = methodProxy.invokeSuper(o, objects);
                }

                return invokeSuper;
            }
        });
        Person personProxy = (Person) enhancer.create();
//        personProxy.eat("brand");
        personProxy.drink();
    }
}

// 被代理类
class Person {
    public Person() {
    }

    public void eat(String food) {
        System.out.println("张三正在吃" + food);
    }

    public void drink() {
        System.out.println("正在喝茶");
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值