【发布时间】:2015-12-11 08:19:04
【问题描述】:
我正在制作一个 JCL 日志桥,它在多个(比如说两个)日志实现(比如 log4j)上运行。根据所有这些实现的配置,桥比做出自定义全局决定是否记录以及记录到所有或不记录所有底层实现。
日志实现通常有这样的方法:
- 公开
isLevelEnabled()测试“可记录性” - public
logLevel(msg)使用测试方法并最终通过 -> 记录消息
- 受保护的
logInternal(lvl, msg)无需额外测试即可记录
现在,由于我在启用级别时做出自定义决定,因此我无法使用做出标准决定的公共日志方法,我需要直接使用受保护的方法。
我知道,我可以从同一个包中访问受保护的成员,所以我添加了一个与目标实现的记录器类具有相同包的“入侵者”类:
package com.log.lib;
//logging library logger in dependency jar
public class Logger {
protected void logInternal(int lvl, String msg){
//library logging without additional level testing
}
}
package com.log.lib;
//my class to access protected method of library logger
public class LoggerAccessor {
public void log(Logger logger, int lvl, String msg) {
logger.logInternal(lvl, msg);
}
}
这很好,直到我在应用程序服务器上运行代码,该应用程序服务器提供由与我的应用程序不同的类加载器加载的日志记录实现之一。我有一个IllegalAccessException。这就是我了解运行时包(例如quick explanation here)的方式。
我可以通过授予可访问性来通过反射调用该方法,我什至可以自动测试运行时包并在直接调用和反射之间进行选择。但是反射总是在应用程序运行的应用程序服务器上使用。而且由于日志记录是一种广泛使用的活动,因此反射在这里是一种瓶颈。
所以我问:有没有更好(更快)的方法来从不同的运行时包调用受保护的方法(或记录,例如通过 log4j 而没有它的决策)?
【问题讨论】:
标签: java logging reflection runtime access-modifiers