public interface Advice();
public interface ConstructorInterceptor extends Interceptor
class DebuggingInterceptor implements ConstructorInterceptor {
Object instance=null;
Object construct(ConstructorInvocation i) throws Throwable {
if(instance==null) {
return instance=i.proceed();
} else {
throw new Exception("singleton does not allow multiple instance");
}
}
}
/**
* 实现这个接口方法可以在构造新对象之前或者构造新对象之后进行额外的操作
* 建议通过调用Joinpoint.proceed()方法实现
*
* @param invocation 构造器的joinpoint
* @return 最新创建的对象,也可以是调用Joinpoint.proceed()方法的结果(可能会被拦截器替代)
* @throws 拦截器或目标对象抛出的异常
*/
Object construct(ConstructorInvocation invocation);
public interface ConstructorInvocation extends Invocation
/**
* 获取正在被调用的构造器
* 推荐使用Joinpoint.getStaticpart()方法实现
*
* @return 正在被调用的构造器
*/
Constructor<?> getConstructor();
public interface Interceptor extends Advice
class DebuggingInterceptor implements MethodInterceptor,
ConstructorInterceptor {
Object invoke(MethodInvocation i) throws Throwable {
debug(i.getMethod(), i.getThis(), i.getArgs());
return i.proceed();
}
Object construct(ConstructorInvocation i) throws Throwable {
debug(i.getConstructor(), i.getThis(), i.getArgs());
return i.proceed();
}
void debug(AccessibleObject ao, Object this, Object value) {
...
}
}
public interface Invocation extends Joinpoint
/**
* 获取参数作为一个数组对象
* 可以通过更改此数组中的元素值以更改参数
*
* @return 调用中的参数
*/
Object[] getArguments();
public interface Joinpoint
/**
* 获取当前joinpoint的静态部分
* 静态部分是指一个链式拦截器中可访问的对象
*
* @return 当前joinpoint的静态部分
*/
Object getStaticPart();
/**
* 获取包含当前joinpoint静态部分的对象
* 比如一个调用的目标对象
*
* @return 如果可访问的对象是静态的返回值可以为空
*/
Object getThis();
/**
* 继续进行到链表中的下一个拦截器
* 此方法的实现和语义取决于实际joinpoint的类型
*
* @return 子接口中的定义
* @throws joinpoint抛出的异常
*/
Object proceed();
@FunctionalInterface
public interface MethodInterceptor extends Interceptor
class TracingInterceptor implements MethodInterceptor {
Object invoke(MethodInvocation i) throws Throwable {
System.out.println("method "+i.getMethod()+" is called on "+
i.getThis()+" with args "+i.getArguments());
Object ret=i.proceed();
System.out.println("method "+i.getMethod()+" returns "+ret);
return ret;
}
}
/**
* 实现这个接口方法可以在构造新对象之前或者构造新对象之后进行额外的操作
* 建议通过调用Joinpoint.proceed()方法实现
*
* @param invocation 方法调用的joinpoint
* @return 调用的Joinpoint.proceed()的结果,可能被拦截器拦截
* @throws 拦截器或者目标对象抛出的异常
*/
Object invoke(MethodInvocation invocation);
public interface MethodInvocation extends Invocation
/**
* 获取正在被调用的方法
* 这个方法是Joinpoint.getStaticPart()方法的友好实现
*
* @return 正在被调用的方法
*/
Method getMethod();
public interface Log
/**
* 使用trace日志级别记录日志的消息
*
* @param message 日志的消息
*/
void trace(Object message);
/**
* 使用trace日志级别记录日志的消息
*
* @param message 日志的消息
* @param t 产生trace日志的原因
*/
void trace(Object message, Throwable t);
/**
* 使用debug日志级别记录日志的消息
*
* @param message 日志的消息
*/
void debug(Object message);
/**
* 使用debug日志级别记录日志的消息
*
* @param message 日志的消息
* @param t 产生debug日志的原因
*/
void debug(Object message, Throwable t);
/**
* 使用info日志级别记录日志的消息
*
* @param message 日志的消息
*/
void info(Object message);
/**
* 使用info日志级别记录日志的消息
*
* @param message 日志的消息
* @param t 产生info日志的原因
*/
void info(Object message, Throwable t);
/**
* 使用warn日志级别记录日志的消息
*
* @param message 日志的消息
*/
void warn(Object message);
/**
* 使用warn日志级别记录日志的消息
*
* @param message 日志的消息
* @param t 产生warn日志的原因
*/
void warn(Object message, Throwable t);
/**
* 使用error日志级别记录日志的消息
*
* @param message 日志的消息
*/
void error(Object message);
/**
* 使用error日志级别记录日志的消息
*
* @param message 日志的消息
* @param t 产生error日志的原因
*/
void error(Object message, Throwable t);
/**
* 使用fatal日志级别记录日志的消息
*
* @param message 日志的消息
*/
void fatal(Object message);
/**
* 使用fatal日志级别记录日志的消息
*
* @param message 日志的消息
* @param t 产生fatal日志的原因
*/
void fatal(Object message, Throwable t);
/**
* 当前是否启用info等级日志记录
* 调用此方法可以防止当日志等级超过info级别时执行更严重的操作
*
* @return 如果基础日志中启动了info等级则为true
*/
boolean isTraceEnabled();
/**
* 当前是否启用debug等级日志记录
* 调用此方法可以防止当日志等级超过debug级别时执行更严重的操作
*
* @return 如果基础日志中启动了debug等级则为true
*/
boolean isDebugEnabled();
/**
* 当前是否启用info等级日志记录
* 调用此方法可以防止当日志等级超过info级别时执行更严重的操作
*
* @return 如果基础日志中启动了info等级则为true
*/
boolean isInfoEnabled();
/**
* 当前是否启用warn等级日志记录
* 调用此方法可以防止当日志等级超过warn级别时执行更严重的操作
*
* @return 如果基础日志中启动了warn等级则为true
*/
boolean isWarnEnabled();
/**
* 当前是否启用error等级日志记录
* 调用此方法可以防止当日志等级超过error级别时执行更严重的操作
*
* @return 如果基础日志中启动了error等级则为true
*/
boolean isErrorEnabled();
/**
* 当前是否启用fatal等级日志记录
* 调用此方法可以防止当日志等级超过fatal级别时执行更严重的操作
*
* @return 如果基础日志中启动了fatal等级则为true
*/
boolean isFatalEnabled();
public abstract class LogFactory extends Object
/**
* 返回一个已经命名的日志记录器
*
* @param clazz 包含从日志名称派生的类
*/
static Log getLog(Class<?> clazz)
/**
* 返回一个已经命名的日志记录器
*
* @param name 返回的日志实例的逻辑名称
*/
static Log getLog(String name)
public class NoOpLog extends Object implements Log, Serializable
/**
* 使用trace日志级别记录日志的消息
*
* @param message 日志的消息
*/
void trace(Object message);
/**
* 使用trace日志级别记录日志的消息
*
* @param message 日志的消息
* @param t 产生trace日志的原因
*/
void trace(Object message, Throwable t);
/**
* 使用debug日志级别记录日志的消息
*
* @param message 日志的消息
*/
void debug(Object message);
/**
* 使用debug日志级别记录日志的消息
*
* @param message 日志的消息
* @param t 产生debug日志的原因
*/
void debug(Object message, Throwable t);
/**
* 使用info日志级别记录日志的消息
*
* @param message 日志的消息
*/
void info(Object message);
/**
* 使用info日志级别记录日志的消息
*
* @param message 日志的消息
* @param t 产生info日志的原因
*/
void info(Object message, Throwable t);
/**
* 使用warn日志级别记录日志的消息
*
* @param message 日志的消息
*/
void warn(Object message);
/**
* 使用warn日志级别记录日志的消息
*
* @param message 日志的消息
* @param t 产生warn日志的原因
*/
void warn(Object message, Throwable t);
/**
* 使用error日志级别记录日志的消息
*
* @param message 日志的消息
*/
void error(Object message);
/**
* 使用error日志级别记录日志的消息
*
* @param message 日志的消息
* @param t 产生error日志的原因
*/
void error(Object message, Throwable t);
/**
* 使用fatal日志级别记录日志的消息
*
* @param message 日志的消息
*/
void fatal(Object message);
/**
* 使用fatal日志级别记录日志的消息
*
* @param message 日志的消息
* @param t 产生fatal日志的原因
*/
void fatal(Object message, Throwable t);
/**
* 当前是否启用trace等级日志记录
* 调用此方法可以防止当日志等级超过trace级别时执行更严重的操作
*
* @return 如果基础日志中启动了trace等级则为true
*/
boolean isTraceEnabled();
/**
* 当前是否启用debug等级日志记录
* 调用此方法可以防止当日志等级超过debug级别时执行更严重的操作
*
* @return 如果基础日志中启动了debug等级则为true
*/
boolean isDebugEnabled();
/**
* 当前是否启用info等级日志记录
* 调用此方法可以防止当日志等级超过info级别时执行更严重的操作
*
* @return 如果基础日志中启动了info等级则为true
*/
boolean isInfoEnabled();
/**
* 当前是否启用warn等级日志记录
* 调用此方法可以防止当日志等级超过warn级别时执行更严重的操作
*
* @return 如果基础日志中启动了warn等级则为true
*/
boolean isWarnEnabled();
/**
* 当前是否启用error等级日志记录
* 调用此方法可以防止当日志等级超过error级别时执行更严重的操作
*
* @return 如果基础日志中启动了error等级则为true
*/
boolean isErrorEnabled();
/**
* 当前是否启用fatal等级日志记录
* 调用此方法可以防止当日志等级超过fatal级别时执行更严重的操作
*
* @return 如果基础日志中启动了fatal等级则为true
*/
boolean isFatalEnabled()