/* 3个辅助类*/java
//检查网络网络
public class CheckSafe {this
public void checkSafe() { System.out.println("正在检测网络环境"); }
public class Logger {.net
public void log() { System.out.println("正在记录当前操做"); }
/关于权限的javabean/代理
public class Privillage {code
private String access; public String getAccess() { return access; } public void setAccess(String success) { this.access = success; }
// 目标类对象
/需求是 利用cglib 来检查是否有足够的权限去查看工资 OA/get
public class ShowSalary {it
public void showSalary() { System.out.println("你的薪资是300000$"); }
package com.cheng.oashowsalary;class
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(); }
}