/* 3个辅助类*/
//检查网络
public class CheckSafe {
public void checkSafe() {
System.out.println("正在检测网络环境");
}
}
public class Logger {
public void log() {
System.out.println("正在记录当前操作");
}
}
/关于权限的javabean/
public class Privillage {
private String access;
public String getAccess() {
return access;
}
public void setAccess(String success) {
this.access = success;
}
}
// 目标类
/需求是 利用cglib 来检查是否有足够的权限去查看工资 OA/
public class ShowSalary {
public void showSalary() {
System.out.println("你的薪资是300000$");
}
}
package com.cheng.oashowsalary;
import java.lang.reflect.Method;
import org.junit.experimental.runners.Enclosed;
import net.sf.cglib.proxy.Enhancer; import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy;
public class CglibShowSalaryintercepter implements MethodInterceptor {
public Privillage privillage;
private Object target;
private Logger logger;
private CheckSafe checkSafe;
public CglibShowSalaryintercepter(Privillage privillage, Object target, Logger logger, CheckSafe checkSafe) {
this.privillage = privillage;
this.target = target;
this.logger = logger;
this.checkSafe = checkSafe;
}
// 创建子类代理对象
public Object createProxy() {
Enhancer enhancer = new Enhancer();
enhancer.setCallback(this);
enhancer.setClassLoader(target.getClass().getClassLoader());
enhancer.setSuperclass(target.getClass());
enhancer.setInterfaces(target.getClass().getInterfaces());
return enhancer.create();
}
public Object intercept(Object arg0, Method method, Object[] args, MethodProxy arg3) throws Throwable {
// 无论是否具有权限 都要被记录其操作 以及检查其所在网络环境
checkSafe.checkSafe();
logger.log();
String name = method.getName();
// 对于查看薪资的方法必须查看其权限
if (name.equals("showSalary")) {
String access = privillage.getAccess();
if (access.equals("boss")) {
method.invoke(target, args);
} else {
System.out.println("你无权查看薪资");
}
} else {
// 目标对象
method.invoke(target, args);
}
return null;
}
}
package com.cheng.oashowsalary;
import static org.junit.Assert.*;
import org.junit.Test;
public class CglibShowSalaryintercepterTest {
[@Test](https://my.oschina.net/azibug)
public void testCreateProxy() {
Privillage privillage = new Privillage();
privillage.setAccess("boss");
ShowSalary target = new ShowSalary();
CglibShowSalaryintercepter cglibShowSalaryintercepter = new CglibShowSalaryintercepter(privillage, target,
new Logger(), new CheckSafe());
ShowSalary showSalary = (ShowSalary) cglibShowSalaryintercepter.createProxy();
showSalary.showSalary();
}
}