- 对类进行代理。
- 动态生成 被代理类的代理对象。
- 对被代理类的方法,实现定制化的增强。(setCallbackFilter)
public class Test1 {
public static void main(String[] args) {
// 将代理类Class文件 输出到磁盘
System.setProperty(DebuggingClassWriter.DEBUG_LOCATION_PROPERTY, "f:\\cglib");
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(BClass.class);
enhancer.setCallbacks(new Callback[]{new LogAspect(),new SecurityAspect()});
enhancer.setCallbackFilter(new AspectFilter());
BClass bClass = (BClass) enhancer.create();
bClass.insert("zs");
bClass.get();
}
}
class BClass {
public void insert(String info) {
System.out.println("插入...: " + info);
}
public boolean remove(Integer id) {
System.out.println("移除...: " + id);
return true;
}
public boolean update(String name) {
System.out.println("更新...: " + name);
return false;
}
public Object get() {
System.out.println("获取对象信息。");
return "zs";
}
}
class LogAspect implements MethodInterceptor {
/**
* @param obj "this", the enhanced object
* @param method intercepted Method
* @param args argument array; primitive types are wrapped
* @param proxy used to invoke super (non-intercepted method); may be called
* as many times as needed
* @return
* @throws Throwable
*/
@Override
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
System.out.println("前置日志...");
Object o = proxy.invokeSuper(obj, args);
System.out.println("后置日志,"+o);
return o;
}
}
class SecurityAspect implements MethodInterceptor{
@Override
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
System.out.println("前置安全...");
Object o = proxy.invokeSuper(obj, args);
System.out.println("后置安全,"+o);
return o;
}
}
class AspectFilter implements CallbackFilter{
/**
* 用于判断方法该有哪个callback来执行,返回值为callback数组的索引
* @param method the intercepted method
* @return setCallbacks, callback数组的索引
*/
@Override
public int accept(Method method) {
if (method.getName().startsWith("insert")) {
return 0;
}
return 1;
}
}
如果出现
需在VM选项添加: --add-opens java.base/java.lang=ALL-UNNAMED
运行结果: