package
com.apsoft.test.cglib;
import java.lang.reflect.Method;
import net.sf.cglib.proxy.Callback;
import net.sf.cglib.proxy.CallbackFilter;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import net.sf.cglib.proxy.NoOp;
public class CgLibTest
... {
public static void main(String argv[])
...{
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(TargetClass.class);
CallbackFilter callbackFilter = new TargetCallbackFilter();
enhancer.setCallbackFilter(callbackFilter);
AuthorizationService authorizationService = new AuthorizationServiceImpl();
Callback saveCallback = new AuthorizationInterceptor(
authorizationService);
Callback loadCallback = NoOp.INSTANCE;
Callback[] callbacks =
...{ saveCallback, loadCallback };
enhancer.setCallbacks(callbacks);
// enhancer.setCallback(NoOp.INSTANCE);
Object obj = enhancer.create();
Logger.debug("开始执行save方法...");
TargetClass target = (TargetClass) obj;
target.save();
}
}
/** */ /**
* 认证拦截器,定义实现了方法拦截器,实现在调用目标方法前先认证。
*
* @author Administrator
*
*/
class AuthorizationInterceptor implements MethodInterceptor
... {
private AuthorizationService[] authorizers = null;
/** *//**
* 通过构造函数,注入认证服务处理器
*
* @param authorizers
*/
public AuthorizationInterceptor(AuthorizationService... authorizers)
...{
this.authorizers = authorizers;
}
/** *//**
* 拦截器处理方法
*/
public Object intercept(Object object, Method method, Object[] args,
MethodProxy methodProxy) throws Throwable
...{
Logger.debug("拦截器捕获方法调用 method =" + method.getName());
if (null == authorizers)
...{
return null;
}
boolean retFlag = true;
for (AuthorizationService authorizer : authorizers)
...{
retFlag &= authorizer.authorize(method);
}
// 根据认证是否通过,执行不同的操作。
if (retFlag)
...{
return methodProxy.invokeSuper(object, args);
}
else
...{
return null;
}
}
}
/** */ /**
* 目标调用回调过滤器
*
* @author Administrator
*
*/
class TargetCallbackFilter implements CallbackFilter
... {
/** *//**
* 定义方法执行回调函数索引
*
* @method 被调用的方法
* @return 函数回调索引
*/
public int accept(Method method)
...{
Logger.debug("执行过滤方法: method = " + method.getName());
if (method.getName().equals("save"))
...{
return 0;
}
return 1;
}
}
/** */ /**
* 认证服务接口
*
* @author Administrator
*
*/
interface AuthorizationService
... {
public boolean authorize(Method method);
}
/** */ /**
* 认证服务实现类
*
* @author Administrator
*
*/
class AuthorizationServiceImpl implements AuthorizationService
... {
public boolean authorize(Method method)
...{
Logger.debug("执行鉴权操作。");
return true;
}
}
/** */ /**
* 被调用的目标类
*
* @author Administrator
*
*/
class TargetClass
... {
public void save()
...{
Logger.debug("调用save方法");
}
public void load()
...{
Logger.debug("调用load方法");
}
}
/** */ /**
* 日志工具类
*
* @author Administrator
*
*/
class Logger
... {
public static void debug(String message)
...{
System.out.println(message);
}
}
import java.lang.reflect.Method;
import net.sf.cglib.proxy.Callback;
import net.sf.cglib.proxy.CallbackFilter;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import net.sf.cglib.proxy.NoOp;
public class CgLibTest
... {
public static void main(String argv[])
...{
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(TargetClass.class);
CallbackFilter callbackFilter = new TargetCallbackFilter();
enhancer.setCallbackFilter(callbackFilter);
AuthorizationService authorizationService = new AuthorizationServiceImpl();
Callback saveCallback = new AuthorizationInterceptor(
authorizationService);
Callback loadCallback = NoOp.INSTANCE;
Callback[] callbacks =
...{ saveCallback, loadCallback };
enhancer.setCallbacks(callbacks);
// enhancer.setCallback(NoOp.INSTANCE);
Object obj = enhancer.create();
Logger.debug("开始执行save方法...");
TargetClass target = (TargetClass) obj;
target.save();
}
}
/** */ /**
* 认证拦截器,定义实现了方法拦截器,实现在调用目标方法前先认证。
*
* @author Administrator
*
*/
class AuthorizationInterceptor implements MethodInterceptor
... {
private AuthorizationService[] authorizers = null;
/** *//**
* 通过构造函数,注入认证服务处理器
*
* @param authorizers
*/
public AuthorizationInterceptor(AuthorizationService... authorizers)
...{
this.authorizers = authorizers;
}
/** *//**
* 拦截器处理方法
*/
public Object intercept(Object object, Method method, Object[] args,
MethodProxy methodProxy) throws Throwable
...{
Logger.debug("拦截器捕获方法调用 method =" + method.getName());
if (null == authorizers)
...{
return null;
}
boolean retFlag = true;
for (AuthorizationService authorizer : authorizers)
...{
retFlag &= authorizer.authorize(method);
}
// 根据认证是否通过,执行不同的操作。
if (retFlag)
...{
return methodProxy.invokeSuper(object, args);
}
else
...{
return null;
}
}
}
/** */ /**
* 目标调用回调过滤器
*
* @author Administrator
*
*/
class TargetCallbackFilter implements CallbackFilter
... {
/** *//**
* 定义方法执行回调函数索引
*
* @method 被调用的方法
* @return 函数回调索引
*/
public int accept(Method method)
...{
Logger.debug("执行过滤方法: method = " + method.getName());
if (method.getName().equals("save"))
...{
return 0;
}
return 1;
}
}
/** */ /**
* 认证服务接口
*
* @author Administrator
*
*/
interface AuthorizationService
... {
public boolean authorize(Method method);
}
/** */ /**
* 认证服务实现类
*
* @author Administrator
*
*/
class AuthorizationServiceImpl implements AuthorizationService
... {
public boolean authorize(Method method)
...{
Logger.debug("执行鉴权操作。");
return true;
}
}
/** */ /**
* 被调用的目标类
*
* @author Administrator
*
*/
class TargetClass
... {
public void save()
...{
Logger.debug("调用save方法");
}
public void load()
...{
Logger.debug("调用load方法");
}
}
/** */ /**
* 日志工具类
*
* @author Administrator
*
*/
class Logger
... {
public static void debug(String message)
...{
System.out.println(message);
}
}