jdk动态代理和cglib动态代理

**jdk动态代理:

	jdk动态代理面向接口的动态代理,一定要有接口和实现类存在,代理对象增加的是实现类,在实现接口的方法重写的方法代理的对象只能转化成接口,不能转化成被代理的类。
	只增强接口定义的方法。
	只能读取到接口方法的注解。

**

package com.yxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class Jdk {
    public static void main(String[] args) {
        Dinner dinner=new Person("yzy");
        /*被代理对象的类加载器*/
        ClassLoader classLoader = dinner.getClass().getClassLoader();
        Class<?>[] interfaces = dinner.getClass().getInterfaces();
        InvocationHandler invocationHandler=new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                Object res=null;
                if (method.getName().equals("eat")){
                    System.out.println("饭前洗手");
                    res=method.invoke(dinner,args);
                    System.out.println("饭后刷碗");

                }else {
                    res=method.invoke(dinner,args);
                }
                return res;
            }
        };

        Dinner dinner1 = (Dinner) Proxy.newProxyInstance(classLoader, interfaces, invocationHandler);
        dinner1.eat("汉堡");

    }
}
interface  Dinner{
    void eat(String foodName);
    void drink();
}
class Person implements Dinner{

    private String name;

    public Person() {
    }

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public void eat(String foodName) {
        System.out.println(name+"正在吃"+foodName);
    }

    @Override
    public void drink() {
        System.out.println(name+"正在喝");
    }
}
class Student implements Dinner{
    private String name;

    public Student() {
    }

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

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

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

**

cgilb动态代理


package com.yxy;

import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

public class Cglib {
    public static void main(String[] args) {
        Person person=new Person();
        /*设置Enhancer*/
        Enhancer enhancer=new Enhancer();
        enhancer.setSuperclass(person.getClass());
        MethodInterceptor methodInterceptor=new MethodInterceptor() {
            public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
                Object res=null;
                if (method.getName().equals("eat")){
                    System.out.println("饭前洗手");
                    res=methodProxy.invokeSuper(o,objects);
                    System.out.println("洗碗");

                }else{
                    res=methodProxy.invoke(o,objects);
                }
                return res;
            }
        };
        enhancer.setCallback(methodInterceptor);
        Person person1 = (Person)enhancer.create();
        person1.eat("米饭");
    }
}
class  Person{
    public Person() {
    }

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


`

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值