javassist 实现接口动态代理

首先有一个学生的接口,学生的接口中有一个上交家庭作业的方法,定义很简单

package javaassist;

/**
 * Created by wangtengfei1 on 2017/8/2.
 * 学生接口
 */
public interface IStu {
    /**
     * 交作业
     */
    public void handupTask();
}

 

然后定义一个动态代理的对象,用以实现这个方法

package javaassist;
import javassist.*;
/**
 * Created by wangtengfei1 on 2017/8/2.
 * 动态代理对象
 */
public class Proxy<T> {

    private Class<T> t;//接口
    public Proxy(Class<T> t){
        this.t = t;
    }

    private static final String PROXYFREFIX = "$Proxy";//生成的代理对象名称前缀
    private static final String PROXYSUFFIX = "Impl";//生成的代理对象名称前缀

    //生成代理对象
    public T getProxyOject(){
        T proxyObject = null;
        try {
            ClassPool pool = ClassPool.getDefault();
            CtClass ctClass = pool.makeClass(getPackageName() + getProxyObjectName()); //创建代理类对象

            //设置代理类的接口
            CtClass interf = pool.getCtClass(getPackageName()+"."+t.getSimpleName()); //获取代理对象的接口类
            CtClass[] interfaces = new CtClass[]{interf};
            ctClass.setInterfaces(interfaces);

            CtMethod[] methods = interf.getDeclaredMethods(); //代理类的所有方法
            CtField[] fields = interf.getDeclaredFields();//代理类的所有属性
            for(CtMethod method:methods){
                String methodName = method.getName();
                CtMethod cm = new CtMethod(method.getReturnType(), methodName, method.getParameterTypes(), ctClass);
                cm.setBody("System.out.println(\"hand up my homework from proxy Object\");");
                ctClass.addMethod(cm);
            }
            Class aClass = ctClass.toClass();
            proxyObject=(T) aClass.newInstance();
        } catch (NotFoundException |CannotCompileException |IllegalAccessException |InstantiationException e) {
            e.printStackTrace();
        }
        return proxyObject;
    }

    //获取包名
    public String getPackageName(){
        Package aPackage = t.getPackage();
        String packageName = aPackage.getName();
        return packageName;
    }

    //获取代理对象的名称
    public String getProxyObjectName(){
        return PROXYFREFIX+t.getSimpleName()+PROXYSUFFIX;
    }

}

具体代码内容,里面已经写了,就不做重复解读了。

然后定义调用类,并且查看输出结果

package javaassist;

/**
 * Created by wangtengfei1 on 2017/8/2.
 */
public class Main {
    @org.junit.Test
    public void test(){
        Proxy<IStu> proxy = new Proxy<>(IStu.class);
        IStu proxyOject = proxy.getProxyOject();
        System.out.println("proxy Object name:"+proxyOject.getClass().getName());
        proxyOject.handupTask();
    }
}

输出结果如下:

proxy Object name:javaassist$ProxyIStuImpl
hand up my homework from proxy Object

Process finished with exit code 0

 

此代理对象定义的比较简单,并且实现也比较单一,但是对于理解spring启动的时候对象如何占位,起到了非常好的作用。

转载于:https://my.oschina.net/u/2457218/blog/1499778

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值