目标:把org.apache.log4j.Logger转化为test.Logger, 使其它类调用test.Logger像调用org.apache.log4j.Logger一样,具有相同的行为。同时对其它类完全隐藏Log4j.
因为使用OSGi所以不方便暴露log4j,需要做一个转化,但同时,Log4j的Logger对象是有缓存的,所以不想通过新建对象的test.Logger(org.apache.log4j.Logger)的方式。下面的实现,是我想要的功能,但并不是正确的,
public class Logger extends org.apache.log4j.Logger{
public Logger(String name) {
super(name);
} public static Logger getLogger(String cat){
return (Logger) org.apache.log4j.Logger.getLogger(cat);
}
public static Logger getLogger(Class clazz){
return (Logger) org.apache.log4j.Logger.getLogger(clazz);
}
}大家有什么想法?
因为使用OSGi所以不方便暴露log4j,需要做一个转化,但同时,Log4j的Logger对象是有缓存的,所以不想通过新建对象的test.Logger(org.apache.log4j.Logger)的方式。下面的实现,是我想要的功能,但并不是正确的,
public class Logger extends org.apache.log4j.Logger{
public Logger(String name) {
super(name);
} public static Logger getLogger(String cat){
return (Logger) org.apache.log4j.Logger.getLogger(cat);
}
public static Logger getLogger(Class clazz){
return (Logger) org.apache.log4j.Logger.getLogger(clazz);
}
}大家有什么想法?
/**
* For use with a log4j factory.
*/
public Logger(org.apache.log4j.Logger logger ) {
if (logger == null) {
throw new IllegalArgumentException(
"Warning - null logger in constructor; possible log4j misconfiguration.");
}
this.name = logger.getName();
this.logger=logger;
}
只是这样,每次通过Logger.getLogger()都要新建一个包含对Log4j Logger封装的对象。
比较郁闷。不过感觉Java也确实没办法实现接口的平行转换。