java 代理机制的实例详解
前言:
java代理分静态代理和动态代理,动态代理有jdk代理和cglib代理两种,在运行时生成新的子类class文件。本文主要练习下动态代理,代码用于备忘。对于代理的原理和机制,网上有很多写的很好的,就不班门弄斧了。
jdk代理
实例代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class ProxyFactory implements InvocationHandler {
private Object tarjectObject;
public Object creatProxyInstance(Object obj) {
this .tarjectObject = obj;
return Proxy.newProxyInstance( this .tarjectObject.getClass()
.getClassLoader(), this .tarjectObject.getClass()
.getInterfaces(), this );
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Object result = null ;
if (AssessUtils.isAssess()) {
result = method.invoke( this .tarjectObject, args);
} else {
throw new NoAssessException( "This server cannot run this service." );
}
return result;
}
}
|
cglib代理
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
import java.lang.reflect.Method;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;
public class ProxyCglibFactory implements MethodInterceptor {
private Object tarjectObject;
public Object creatProxyInstance(Object obj) {
this .tarjectObject = obj;
Enhancer enhancer= new Enhancer();
enhancer.setSuperclass( this .tarjectObject.getClass());
enhancer.setCallback( this );
return enhancer.create();
}
@Override
public Object intercept(Object obj, Method method, Object[] args,
MethodProxy arg3) throws Throwable {
Object result = null ;
if (AssessUtils.isAssess()) {
result = method.invoke( this .tarjectObject, args);
} else {
throw new NoAssessException( "This server cannot run this service." );
}
return result;
}
}
|
Aspect注解
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
@Aspect
public class AssessInterceptor {
@Pointcut (value= "execution (* com..*.*(..))" )
private void anyMethod(){};
@Before ( "anyMethod()" )
public void doBefore(JoinPoint joinPoint) throws NoAssessException{
if (!AssessUtils.isAssess()) {
throw new NoAssessException( "This server cannot run this service." );
}
}
/**
* Around异常的时候调用
* @param pjp
* @throws Throwable
*/
@Around ( "anyMethod()" )
public void invoke(ProceedingJoinPoint pjp) throws Throwable{
pjp.proceed();
}
}
|
以上就是java代理机制的实例,如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
原文链接:http://sheungxin.iteye.com/blog/2346329