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类型的成员变量,也就是调用处理程序,通过调用处理程序来给被代理类增强功能。创建好代理类后就调用类加载器将该类加载到内存,然后再通过反射创建一个该代理类的实例对象。

原文地址:https://www.cnblogs.com/gq365/p/5527763.html