java代理机制
java代理机制分为静态代理和动态代理
并未发现静态代理和动态代理的具体区别,更倾向于动态代理,可以自主灵活配置接口类,可能是在代码运行速度或某些性能方面要快一点(此处没有过多地去了解)。
本人对代理机制的理解简单的一句话就是在调取接口的时候,除了执行接口内的逻辑外还要执行想要执行的代码,就可以用代理机制。不多说直接上代码
1:需要建一个代理类,并在其中加入想要在调用目标接口时想要执行的代码
package com.free.single;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class LogHandler implements InvocationHandler {
// 目标对象
private Object targetObject;
//绑定关系,也就是关联到哪个接口(与具体的实现类绑定)的哪些方法将被调用时,执行invoke方法。
public Object newProxyInstance(Object targetObject){
this.targetObject=targetObject;
return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(),
targetObject.getClass().getInterfaces(),this);
}
@Override
//关联的这个实现类的方法被调用时将被执行
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Object ret=null;
try{
/*原对象方法调用前处理日志信息*/
System.out.println("satrt-->>");
//调用目标方法
ret=method.invoke(targetObject, args);
/*原对象方法调用后处理日志信息*/
System.out.println("success-->>");
}catch(Exception e){
e.printStackTrace();
System.out.println("error-->>");
throw e;
}
return ret;
}
}
2:调用代理类可以执行代理类中想要被执行的逻辑
public static void main(String[] args) {
SpringApplication.run(CKapplication.class, args);
LogHandler logHandler=new LogHandler();
//调用代理参数为目标接口
MemberService userManager=(MemberService)logHandler.newProxyInstance(new MemberServiceImpl());
userManager.findMemberByUname();
}
心得:java代理机制可用于日志输出,调用之前,调用之后分别执行想要执行的方法