spring AOP (5) 基础知识-java动态代理

在「spring AOP (4) 基础知识-代理」中给大家讲解了什么是代理,有什么弊端。

java的动态代理比代理的思想更前进了一步。

首先我们要创建一个代理类,它必须实现java.lang.reflect.InvocationHandler接口。

DynamicProxyHandler:

package spring3.aop.aop3;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

public class DynamicProxyHandler implements InvocationHandler {

	// 目标对象
	private Object proxied;

	public DynamicProxyHandler(Object proxied) {
		this.proxied = proxied;
	}

	/**
	 * invoke.
	 * 
	 * @param proxy    (最终生成的)代理实例,不是目标对象(一般情况下不会用到)
	 * @param method   要调用的方法
	 * @param args     要调用方法的参数
	 */
	@Override
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		System.out.println("----START----");
		// method.invoke是java反射的知识
		Object obj = method.invoke(proxied, args);
		System.out.println("----END----");
		return obj;
	}

}

 接口Interface1

package spring3.aop.aop3;

public interface Interface1 {

	public void do1();

	public void do2(String str);

}

  接口Interface2

package spring3.aop.aop3;

public interface Interface2 {

	public void exe1();

	public void exe2(String str);

}

 目标对象类,Target实现了两个接口Interface1, Interface2

package spring3.aop.aop3;

public class Target implements Interface1, Interface2 {

	@Override
	public void do1() {
		System.out.println("Target.do1()");
	}

	@Override
	public void do2(String str) {
		System.out.println("Target.do2(" + str + ")");
	}

	@Override
	public void exe1() {
		System.out.println("Target.exe1()");
	}

	@Override
	public void exe2(String str) {
		System.out.println("Target.exe2(" + str + ")");
	}

}

 基本的组件我们创建完成了,看看如何利用这些组件:

package spring3.aop.aop3;

import java.lang.reflect.Proxy;

public class ProxyMain {

	/**
	 * @param args
	 */
	public static void main(String[] args) {

		Object obj = Proxy.newProxyInstance(Interface1.class.getClassLoader(),
				new Class<?>[] { Interface1.class, Interface2.class },
				new DynamicProxyHandler(new Target()));

		Interface1 if1 = (Interface1) obj;
		if1.do1();
		if1.do2("test");
		Interface2 if2 = (Interface2) obj;
		if2.exe1();
		if2.exe2("test");
	}
}

 运行结果:

----START----
Target.do1()
----END----
----START----
Target.do2(test)
----END----
----START----
Target.exe1()
----END----
----START----
Target.exe2(test)
----END----

 以上就是java的动态代理,现在我来讲解下测试累的main方法

在main中

通过静态方法Proxy.newProxyInstance()来创建动态的代理。

这个方法需要三个参数:

①类加载器:可以通过已加载对象,获得类加载器。例如:Interface1.class.getClassLoader()

②希望被代理的接口列表,是个Class数组。例如:new Class<?>[] { Interface1.class, Interface2.class }

③java.lang.reflect.InvocationHandler接口的一个实现类。

动态代理就是将所有调用重定向到调用处理器(DynamicProxyHandler),一般会向调用处理器传递一个目标对象(例如:DynamicProxyHandler的构造函数public DynamicProxyHandler(Object proxied)),调用器在在执行中介任务时,将请求转发给目标对象。

猜你喜欢

转载自xieyan30.iteye.com/blog/1844892
今日推荐