有接口的CGLIB动态代理实现

有接口的CGLIB动态代理实现

定义接口

package com.hk.service;
/** * 定义一个接口(一类人要做的事情) * @author 浪丶荡 * */
public interface ISomeService {
    //打官司
    public String Litigate();
    //吃饭
    public String eat();
}

接口的实现类(目标类)

package com.hk.service;
/** * 目标类 * @author 浪丶荡 * */
public class ISomeServiceImp implements ISomeService {

    @Override
    public String Litigate() {
        return "自己打官司,输了";
    }

    @Override
    public String eat() {
        return "自己吃饭";
    }

}

代理工厂

package com.hk.factory;

import java.lang.reflect.Method;

import com.hk.service.ISomeService;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

/** * 创建代理类的工厂 该类要实现MethodInterceptor接口。 * 该类中完成三样工作 * (1)声明目标类的成员变量,并创建以目标类对象为参数的构造器。用于接收目标对象 * (2)定义代理的生成方法,用于创建代理对象。方法名是任意的。代理对象即目标类的子类 * (3)定义回调接口方法。对目标类的增强这在这里完成 * * @author 浪丶荡 * */
public class CGLibFactory implements MethodInterceptor {
    // 声明目标类的成员变量
    private ISomeService target;

    public CGLibFactory() {
    }

    // 创建以目标类对象为参数的构造器,用于接收目标对象
    public CGLibFactory(ISomeService someService) {
        this.target = someService;
    }

    // 定义代理的生成方法,用于创建代理对象
    public ISomeService myCGLibCreator() {
        Enhancer enhancer = new Enhancer();
        // 为代理对象设置父类,即指定目标类
        enhancer.setSuperclass(ISomeService.class);
        /** * 设置回调接口对象 注意,只所以在setCallback()方法中可以写上this, * 是因为MethodIntecepter接口继承自Callback,是其子接口 */
        enhancer.setCallback(this);
        return (ISomeService) enhancer.create();// create用以生成CGLib代理对象
    }

    @Override
    public Object intercept(Object obj, Method method, Object[] args,
            MethodProxy proxy) throws Throwable {
        if (method.toString().contains("eat")) {// 吃饭就不用律师代劳了,自己来
            return (String) method.invoke(target, args);// 反射,调用目标类的方法;
        }
        return "律师打官司,赢了";
    }

}

测试

package com.hk.test;

import com.hk.factory.CGLibFactory;
import com.hk.service.ISomeService;
import com.hk.service.ISomeServiceImp;
public class MyTest {
    public static void main(String[] args) {
        //有money人张三
        ISomeService zhangsan = new ISomeServiceImp();
        //屌丝李四
        ISomeService lisi = new ISomeServiceImp();
        //张三请人打官司
        ISomeService someService = new CGLibFactory(zhangsan).myCGLibCreator();
        System.out.println("zhangsan"+someService.Litigate()+"-----"+someService.eat());
        //苦逼的李四自己打官司,自己吃饭
        System.out.println("lisi"+lisi.Litigate()+"-----"+lisi.eat());
    }
}

结果

zhangsan律师打官司,赢了-----自己吃饭
lisi自己打官司,输了-----自己吃饭

你可能感兴趣的:(动态代理,接口,cglib代理)