/* 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(); }
}