代理

代理分为:静态代理 JDK代理 cglib代理

 

jdk动态代理的本质:在内存中构建出接口的实现类

                       特点:被代理对象必须有接口

cglib代理的本质:在内存中生成被代理对象的子类

                   特点:可以在没有接口的情况下代理


静态例子: ① 建一个简单的Subject接口 

           ② 建一个Subject的实现类

           ③ 建一个增强类(也实现Subject接口)


public interface Subject {
    public void say();
    public String says();
    public void sayss() throws MyException;
    public void sayt();
}


public class RealSubject implements Subject {
    public void say() {
        System.out.println("say");
    }
}

public class ProxySubject implements Subject{
    private Subject subject;
    public void say() {
        System.out.println("=====before=====");
        subject.say();
    }
}

//jing静态代理
@Test
public void test01(){
    Subject subject=new RealSubject();
    ProxySubject subject1=new ProxySubject();
    subject1.setSubject(subject);
    subject1.say();
}

JDK代理的例子:        

  ① 建一个简单的Subject接口 

           ② 建一个Subject的实现类

与上面雷同

//JDK 动态代理
@Test
public void test02(){
   final Subject subject=new RealSubject();
    Subject subject1= (Subject)Proxy.newProxyInstance(subject.getClass().getClassLoader(), subject.getClass().getInterfaces(), new InvocationHandler() {
        public Object invoke(Object o, Method method, Object[] args) throws Throwable {
            Object invoke = method.invoke(subject, args);
            System.out.println("==before==");
            return null;
        }
    });
    subject1.say();
}


cglib代理的例子:        

  ① 建一个简单的Subject接口 

           ② 建一个Subject的实现类

与上面雷同

//cglib 动态代理
@Test
public void test03(){
    final RealSubject subject=new RealSubject();
    Enhancer enhancer=new Enhancer();
    enhancer.setSuperclass(subject.getClass());
    enhancer.setCallback(new MethodInterceptor() {
        public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
            System.out.println("===before===");
            method.invoke(subject,objects);
            return null;
        }
    });
    RealSubject subject1= (RealSubject)enhancer.create();
   subject1.say();
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值