代理即為訪問對象添加一層控制層,使其間接化,控制層可以為對象訪問添加操作屬性。
cglib:Code Generation library,
實例:
1 import java.lang.reflect.Method; 2 3 import net.sf.cglib.proxy.Enhancer; 4 import net.sf.cglib.proxy.MethodInterceptor; 5 import net.sf.cglib.proxy.MethodProxy; 6 7 8 public class MyMethodInterceptor implements MethodInterceptor { 9 10 11 public String myFun(String arg){ 12 return "hello," + arg ; 13 } 14 15 public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable { 16 String methodName = method.getName(); 17 18 System. out .println( "[intercept] fun invoked before" ); 19 String result = (String)args[0] + "..." ; 20 System. out .println( result ); 21 System. out .println( "[intercept] fun invoked after" ); 22 return result; 23 } 24 25 public Object createProxy(){ 26 Enhancer enhancer = new Enhancer(); 27 enhancer.setSuperclass(MyMethodInterceptor. class ); 28 enhancer.setCallback( this ); 29 return enhancer.create(); 30 } 31 32 33 public static void main(String[] args) { 34 MyMethodInterceptor ss = new MyMethodInterceptor(); 35 MyMethodInterceptor proxy = (MyMethodInterceptor)ss.createProxy(); 36 37 c1.myFun( "cglib test" ); 38 39 } 40 41 }
通用工具類:
1 package org.windwant.spring.core.proxy; 2 3 import org.springframework.cglib.proxy.Enhancer; 4 import org.springframework.cglib.proxy.MethodInterceptor; 5 import org.springframework.cglib.proxy.MethodProxy; 6 7 import java.lang.reflect.Method; 8 9 /** 10 * Created by windwant on 2016/6/4. 11 */ 12 public class MyCGLIBProxy implements MethodInterceptor { 13 private Enhancer enhancer = new Enhancer(); 14 public Object getProxy(Class clazz){ 15 enhancer.setSuperclass(clazz); 16 enhancer.setCallback(this); 17 return enhancer.create(); 18 } 19 20 public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable { 21 System.out.println("cglib before action"); 22 Object result = methodProxy.invokeSuper(o, objects); 23 System.out.println("cglib after action"); 24 return result; 25 } 26 }
1 MyCGLIBProxy p = new MyCGLIBProxy(); 2 Performer pp = (Performer) p.getProxy(XXXX.class); 3 pp.XXXX();