• java动态代理使用详解


    我们都知道AOP的原理就是java的动态代理机制,下面我就对java的动态代理机制进行学习与总结

    java动态代理的实现有两个重要的类:

    Proxy:类

    作用就是用来动态创建一个代理对象的类

     InvocationHandler:接口

     每一个动态代理类都必须要实现InvocationHandler这个接口,并且每个代理类的实例都关联到了一个handler,当我们通过代理对象调用一个方法的时候,这个方法的调用就会被转发为由InvocationHandler这个接口的 invoke 方法来进行调用。

    通过一个例子进行学习与理解:

      被代理接口:

    package com.zgq.proxy;
    
    /**
     * @author guoqiang.zhao@insentek.com
     * @date 2016/5/25
     * 修正历史:
     * 2016/5/25:文件创建
     */
    public interface IStudy {
    	void hello(String str);
    }
    

    被代理接口的实现类:

    package com.zgq.proxy;
    
    /**
     * @author guoqiang.zhao@insentek.com
     * @date 2016/5/25
     * 修正历史:
     * 2016/5/25:文件创建
     */
    public class Study implements IStudy {
    	@Override
    	public void hello(String str) {
    		System.out.println("hello:" + str);
    	}
    }
    

    java动态代理类

    package com.zgq.proxy;
    
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    
    /**
     * @author guoqiang.zhao@insentek.com
     * @date 2016/5/25
     * 修正历史:
     * 2016/5/25:文件创建
     */
    public class MyInvocationHandler implements InvocationHandler {
    	private Object object;
    
    	public MyInvocationHandler (Object object){
    		this.object = object;
    	}
    
    	/**
    	 *
    	 * @param proxy 被代理的对象
    	 * @param method 被代理对象的方法
    	 * @param args 被代理对象方法的参数
    	 * @return
    	 * @throws Throwable
    	 */
    	@Override
    	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    		System.out.println("A===================================");
    		method.invoke(object,args);
    		System.out.println("B===================================");
    		return null;
    	}
    }
    

    测试类:

    package com.zgq.proxy;
    
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Proxy;
    
    /**
     * @author guoqiang.zhao@insentek.com
     * @date 2016/5/25
     * 修正历史:
     * 2016/5/25:文件创建
     */
    public class Test {
    	public static void main(String[] args) {
    		Study study = new Study();
    		InvocationHandler invocationHandler = new MyInvocationHandler(study);
    		//Proxy.newProxyInstance用来动态创建一个代理对象的类
    		//study.getClass().getClassLoader() 定义代理类的加载器
    		//study.getClass().getInterfaces()  被代理对象实现的接口
    		//invocationHandler 代理对象调用方法时会调用实现此类的子类的invoke方法
    		IStudy iStudy = (IStudy) Proxy.newProxyInstance(study.getClass().getClassLoader(),study.getClass().getInterfaces(),invocationHandler);
    		iStudy.hello("zgq");
    	}
    }
    

    执行结果:

    A===================================
    hello:zgq
    B===================================
    
    Process finished with exit code 0
    

    通过以上例子对java的动态代理机制有了一定的了解;

    IStudy iStudy = (IStudy) Proxy.newProxyInstance(study.getClass().getClassLoader(),study.getClass().getInterfaces(),invocationHandler);

    执行这句代码的时候会通过反射机制生成一个代理类,该类实现了IStudy接口,并且重写了接口里面的方法,在该代理类里面有一个InvocationHandler类型的成员变量,也就是调用处理程序,通过调用处理程序来给被代理类增强功能。创建好代理类后就调用类加载器将该类加载到内存,然后再通过反射创建一个该代理类的实例对象。

  • 相关阅读:
    coding++ :局部 Loading 加载效果
    coding++:快速构建 kindeditor 富文本编辑器(一)
    POJ 1265 计算几何 多边形面积 内部格点数 边上格点数
    POJ 1385 计算几何 多边形重心
    POJ 1584 计算几何 凸包
    POJ 2653 计算几何
    POJ 3666 DP
    POJ 2184 DP 01背包+完全背包
    POJ 2392 DP 多重背包
    POJ 1930 数学
  • 原文地址:https://www.cnblogs.com/gq365/p/5527763.html
Copyright © 2020-2023  润新知