java 代理机制的实例详解
java代理机制的实例详解
前言:
java代理分静态代理和动态代理,动态代理有jdk代理和cglib代理两种,在运行时生成新的子类class文件。本文主要练习下动态代理,代码用于备忘。对于代理的原理和机制,网上有很多写的很好的,就不班门弄斧了。
jdk代理
实例代码
importjava.lang.reflect.InvocationHandler; importjava.lang.reflect.Method; importjava.lang.reflect.Proxy; publicclassProxyFactoryimplementsInvocationHandler{ privateObjecttarjectObject; publicObjectcreatProxyInstance(Objectobj){ this.tarjectObject=obj; returnProxy.newProxyInstance(this.tarjectObject.getClass() .getClassLoader(),this.tarjectObject.getClass() .getInterfaces(),this); } @Override publicObjectinvoke(Objectproxy,Methodmethod,Object[]args) throwsThrowable{ Objectresult=null; if(AssessUtils.isAssess()){ result=method.invoke(this.tarjectObject,args); }else{ thrownewNoAssessException("Thisservercannotrunthisservice."); } returnresult; } }
cglib代理
importjava.lang.reflect.Method; importorg.springframework.cglib.proxy.Enhancer; importorg.springframework.cglib.proxy.MethodInterceptor; importorg.springframework.cglib.proxy.MethodProxy; publicclassProxyCglibFactoryimplementsMethodInterceptor{ privateObjecttarjectObject; publicObjectcreatProxyInstance(Objectobj){ this.tarjectObject=obj; Enhancerenhancer=newEnhancer(); enhancer.setSuperclass(this.tarjectObject.getClass()); enhancer.setCallback(this); returnenhancer.create(); } @Override publicObjectintercept(Objectobj,Methodmethod,Object[]args, MethodProxyarg3)throwsThrowable{ Objectresult=null; if(AssessUtils.isAssess()){ result=method.invoke(this.tarjectObject,args); }else{ thrownewNoAssessException("Thisservercannotrunthisservice."); } returnresult; } }
Aspect注解
importorg.aspectj.lang.JoinPoint; importorg.aspectj.lang.ProceedingJoinPoint; importorg.aspectj.lang.annotation.Around; importorg.aspectj.lang.annotation.Aspect; importorg.aspectj.lang.annotation.Before; importorg.aspectj.lang.annotation.Pointcut; @Aspect publicclassAssessInterceptor{ @Pointcut(value="execution(*com..*.*(..))") privatevoidanyMethod(){}; @Before("anyMethod()") publicvoiddoBefore(JoinPointjoinPoint)throwsNoAssessException{ if(!AssessUtils.isAssess()){ thrownewNoAssessException("Thisservercannotrunthisservice."); } } /** *Around异常的时候调用 *@parampjp *@throwsThrowable */ @Around("anyMethod()") publicvoidinvoke(ProceedingJoinPointpjp)throwsThrowable{ pjp.proceed(); } }
以上就是java代理机制的实例,如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!