首页 > 代码库 > JDK动态代理
JDK动态代理
实例:为程序添加日志
1. ArithmeticCaluda.java
1 public interface ArithmeticCaluda { 2 3 /** 4 * 加 5 * @param a 6 * @param b 7 * @return 和 8 */ 9 double add(double a, double b); 10 11 /** 12 * 减 13 * @param a 14 * @param b 15 * @return 差 16 */ 17 double sub(double a, double b); 18 19 /** 20 * 乘 21 * @param a 22 * @param b 23 * @return 积 24 */ 25 double mul(double a, double b); 26 27 /** 28 * 除 29 * @param a 30 * @param b 31 * @return 商 32 */ 33 double div(double a, double b); 34 35 }
2.ArithmeticCaludaImp.java
1 public class ArithmeticCaludaImp implements ArithmeticCaluda { 2 /** 3 * 加 4 * @param a 5 * @param b 6 * @return 和 7 */ 8 public double add(double a,double b){ 9 double result=a+b; 10 return result; 11 } 12 /** 13 * 减 14 * @param a 15 * @param b 16 * @return 差 17 */ 18 public double sub(double a,double b){ 19 double result=a-b; 20 return result; 21 } 22 /** 23 * 乘 24 * @param a 25 * @param b 26 * @return 积 27 */ 28 public double mul(double a,double b){ 29 double result=a*b; 30 return result; 31 } 32 /** 33 * 除 34 * @param a 35 * @param b 36 * @return 商 37 */ 38 public double div(double a,double b){ 39 double result=a/b; 40 return result; 41 } 42 }
3.LogProxy.java
1 import java.lang.reflect.InvocationHandler; 2 import java.lang.reflect.Method; 3 import java.lang.reflect.Proxy; 4 import java.util.Arrays; 5 6 public class LogProxy implements InvocationHandler{ 7 //被代理对象 8 private Object target; 9 10 public LogProxy(Object target) { 11 super(); 12 this.target = target; 13 } 14 //得到代理对象 15 public Object getProxy(){ 16 17 //ClassLoader对象,被代理对象进行加载 18 ClassLoader loader=target.getClass().getClassLoader(); 19 20 //Interface接口的数组,被代理的对象实现的所有接口 21 Class[] interfaces=target.getClass().getInterfaces(); 22 23 //InvocationHandler对象,代理实例的调用处理程序 24 InvocationHandler h=this; 25 26 return Proxy.newProxyInstance(loader, interfaces, h); 27 } 28 29 /** 30 * proxy: 代理对象 31 * method: 要调用被代理的方法的Method对象 32 * args: 调用方法时接受的参数 33 */ 34 @Override 35 public Object invoke(Object proxy, Method method, Object[] args) 36 throws Throwable { 37 System.out.println("the "+method.getName()+" method begin with "+Arrays.asList(args)); 38 double result=(double) method.invoke(target, args); 39 System.out.println("the "+method.getName()+" method end with ["+result+"]"); 40 return result; 41 } 42 }
4.Test.java
1 import com.eduask.liusheng.aop.proxy.ArithmeticCaluda; 2 import com.eduask.liusheng.aop.proxy.ArithmeticCaludaImp; 3 4 public class Test { 5 public static void main(String[] args) { 6 ArithmeticCaluda target=new ArithmeticCaludaImp(); 7 LogProxy logProxy=new LogProxy(target); 8 ArithmeticCaluda proxy=(ArithmeticCaluda) logProxy.getProxy(); 9 10 double result=proxy.add(10, 10); 11 System.out.println(result); 12 13 result=proxy.sub(10, 10); 14 System.out.println(result); 15 16 result=proxy.mul(10, 10); 17 System.out.println(result); 18 19 result=proxy.div(10, 10); 20 System.out.println(result); 21 } 22 }
运行结果:
the add method begin with [10.0, 10.0] the add method end with [20.0] 20.0 the sub method begin with [10.0, 10.0] the sub method end with [0.0] 0.0 the mul method begin with [10.0, 10.0] the mul method end with [100.0] 100.0 the div method begin with [10.0, 10.0] the div method end with [1.0] 1.0
JDK的动态代理依靠接口实现,如果有些类并没有实现接口,则不能使用JDK代理
Proxy类是专门完成代理的操作类,可以通过此类为一个或多个接口动态地生成实现类
JDK动态代理
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。