JDK动态代理和CGLIB动态代理

ぃ、小莉子 提交于 2020-02-06 03:18:22

 JDK动态代理

//1.影星接口

package com.entity;

//影星接口
public interface MovieStar {

    public void act();//演戏
}

//2.被代理类----实现一个接口

package com.entity;

//成龙
public class ChengLongStar implements MovieStar{

    @Override
    public void act() {
        System.out.println("我是成龙,我会拍戏");
    }

}

//3.代理类----实现InvocationHandler接口

package com.entity;

import java.lang.reflect.InvocationHandler;//java的设计模式
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

//成龙的经纪人类
public class ChengLongProxy implements InvocationHandler{
    
    //被代理的原始对象
    private Object orientObject;//被代理对象

    //绑定被代理对象,返回一个代理对象
    public Object bind(Object obj){
        this.orientObject=obj;
        return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), this);
    }
    
    //演戏之前要做的事情
    public void beforeAct(){
        System.out.println("谈档期...");
        System.out.println("谈片酬...");
        System.out.println("谈广告合作...");
        System.out.println("签合同...");
    }
    
    //演戏之后要做的事情
    public void afterAct(){
        System.out.println("出席首映式...");
        System.out.println("出席颁奖典礼...");
    }
    
    
    @Override
    public Object invoke(Object proxy, Method method, Object[] args)
            throws Throwable {
        Object result;
        
        beforeAct();
        
        //调用成龙的演戏方法
        result=method.invoke(this.orientObject,null);//利用反射调用方法
        
        afterAct();
        return result;
    }

}

//4.测试类

package com.entity;

import org.junit.Test;

public class ChengLongProxyTest {
    @Test
    public void fun1(){
        //创建成龙对象
        MovieStar chengLong=new ChengLongStar();
        //成龙经纪人对象
        ChengLongProxy proxy=new ChengLongProxy();
        //把成龙和成龙经纪人绑定,返回有经纪人的成龙对象
        chengLong= (MovieStar) proxy.bind(chengLong);
        chengLong.act();
        
    }
}

//结果

谈档期...
谈片酬...
谈广告合作...
签合同...
我是成龙,我会拍戏
出席首映式...
出席颁奖典礼...

CGLIB是借助反编译实现的

 1.抽象类

package com.entity;

//影星抽象类
public abstract class MovieStar {

    //抽象方法
    public abstract void act();//演戏
}

2.被代理类

package com.entity;

//成龙
public class ChengLongStar extends MovieStar{

    @Override
    public void act() {
        System.out.println("我是成龙,我会拍戏");
    }

}

3.代理类

package com.entity;

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 ChengLongProxy implements MethodInterceptor {

    // 被代理对象
    public Object orientObject;//

    public Object bind(Object obj) {
        this.orientObject = obj;
        Enhancer enhancer = new Enhancer();
        // 获得被代理对象的父类
        enhancer.setSuperclass(obj.getClass().getSuperclass());
        enhancer.setCallback(this);
        return enhancer.create();// 返回一个代理对象
    }

    // 演戏之前要做的事情
    public void beforeAct() {
        System.out.println("谈档期...");
        System.out.println("谈片酬...");
        System.out.println("谈广告合作...");
        System.out.println("签合同...");
    }

    // 演戏之后要做的事情
    public void afterAct() {
        System.out.println("出席首映式...");
        System.out.println("出席颁奖典礼...");
    }

    @Override
    public Object intercept(Object obj, Method method, Object[] args,
            MethodProxy proxy) throws Throwable {
        Object result;
        
        beforeAct();
        
        //调用成龙演戏
        result=method.invoke(orientObject, null);
        
        afterAct();
        
        return result;
    }

}

4.测试结果:

谈档期...
谈片酬...
谈广告合作...
签合同...
我是成龙,我会拍戏
出席首映式...
出席颁奖典礼...

  

 

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!