代理模式是指:代理类通过接口实现被代理类的方法,运用比较多的地方是打印日志。
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
如果有不对之处,希望各位前辈指正;