首先有一个学生的接口,学生的接口中有一个上交家庭做业的方法,定义很简单java
package javaassist; /** * Created by wangtengfei1 on 2017/8/2. * 学生接口 */ public interface IStu { /** * 交做业 */ public void handupTask(); }
而后定义一个动态代理的对象,用以实现这个方法spring
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; } }
具体代码内容,里面已经写了,就不作重复解读了。bash
而后定义调用类,而且查看输出结果this
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启动的时候对象如何占位,起到了很是好的做用。code