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代理机制的实例,如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!