java 动态代理

来源:互联网 发布:淘宝可以微信支付吗 编辑:程序博客网 时间:2024/06/03 21:20
public interface Subway {int i=0;int sellTick();}

public class Atmachine implements Subway {@Overridepublic int  sellTick() {// TODO Auto-generated method stubSystem.out.println("出票");return i;}}

import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;public class DynamicProxy  implements InvocationHandler{/** * 动态代理 * @param args */private Object obj=null;/** * 返回一个指定接口的代理类实例,该接口可以将方法调用指派到指定的调用处理程序。*  getClassLoader() - 定义代理类的类加载器*  getInterfaces() - 代理类要实现的接口列表*  this- 指派方法调用的调用处理程序*/public Object obj(Object ob){this.obj=ob;return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), this);}/** * 每个代理实例都具有一个关联的调用处理程序。对代理实例调用方法时,* 将对方法调用进行编码并将其指派到它的调用处理程序的 invoke 方法* @param proxy   代理对象(注意不是目标对象)    * @param method  被代理的方法    * @param args    被代理的方法的参数集*/@Overridepublic Object invoke(Object proxy, Method method, Object[] args)throws Throwable {System.out.println("通过代理");return (Integer)method.invoke(obj, args);}public static void main(String[] args){DynamicProxy proxy=new DynamicProxy();Subway sub= (Subway)proxy.obj(new Atmachine());System.out.println(sub.sellTick());}}



        所谓动态代理类是在运行时生成的class,在生成它时,你必须提供一组interface给它,则动态代理类就宣称它实现了这些interface。当然,动态代理类就充当一个代理,你不要企图它会帮你干实质性的工作,在生成它的实例时你必须提供一个handler,由它接管实际的工作。



0 0
原创粉丝点击