java动态代理模式学习

代理模式是指:代理类通过接口实现被代理类的方法,运用比较多的地方是打印日志。

java动态代理模块使用到了java的反射机制。编写一个动态代理类需要实现java.lang.reflect下的InvocationHandler接口。

根据代码深入学习:

package AOP;

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

public class DynaProxyServiceA implements InvocationHandler{
	private Object target;
	public Object bind(Object object) {
		this.target=object;
		Object obj=Proxy.newProxyInstance(this.target.getClass().getClassLoader(),this.target.getClass().getInterfaces(), this);
		return obj;
	}
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		Object result=null;
		System.out.println("menthod:"+method);
		System.out.println("args:"+args);
		System.out.println("target:"+target);
		System.out.println("start");
		try {
			result=method.invoke(this.target, args);
		}catch(Exception e) {
			e.printStackTrace();
		}
		System.out.println("end");
		return result;
	}
}

先了解public static Object newProxyInstance( ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)方法的三个参数的含义:
1:loader 指定用哪个类加载器去加载代理对象
2:interfaces 需要实现的接口
3:h 动态代理执行时,会主动调用h(即DynaProxyServiceA类)里面的invoke方法去执行

public Object invoke(Object proxy, Method method, Object[] args)方法
1:proxy 代理对象,即newProxyInstance()放回的对象
2:method 调用的方法
3:args 方法中的参数
注:这边设计到与反射机制相关的Method
以上是动态代理最重要的知识点
下面展示相关代码:

package AOP;
//接口Iservice  代理模式代理的是接口不是类或其它
public interface IService {
	public void service(String name) throws Exception;
}

package AOP;
//接口实现
public class ServiceImplA implements IService{

	public void service(String name) throws Exception {
		System.out.println("ServiceImplA name:"+name);
	}	

}

package AOP;
//main函数调用测试
public class test {
	public static void main(String[] args) throws Exception{
		IService service=(IService)new DynaProxyServiceA().bind(new ServiceImplA());
		service.service("cyw"); 
	}

}

由main函数代码可见首先是创建一个处理类DynaProxyServiceA()对象,然后调用bind()方法。首先,在bind方法中我们传入了一个IService的实现类ServiceImlpA()的对象, 然后通过bind()方法我们通过newProxyInstance()创建与之相关的代理类对象,即service。代理类执行sevice(“cyw”)时自动执行DynaProxyServiceA()类的invoke方法。运行结束。
给出运行结果:
menthod:public abstract void AOP.IService.service(java.lang.String) throws java.lang.Exception
args:[Ljava.lang.Object;@4e718207
target:AOP.ServiceImplA@1d371b2d
start
ServiceImplA name:cyw
end

method args target给出了具体的参数;

java动态模块的学习参考了 徐兴海前辈的博客https://blog.csdn.net/u012326462/article/details/81293186
如果有不对之处,希望各位前辈指正;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值