Chr*_*son 9 java class introspection
我的Java生锈了所以请耐心等待.在CI中可以做到:
int someFunc(void)
{
printf("I'm in %s\n", __func__);
}
Run Code Online (Sandbox Code Playgroud)
在Java中,我可以通过词汇方式获取当前正在定义的类型的名称或类.例如,如果我有:
import org.apache.log4j.Logger;
class myClass {
private static final Logger logger = Logger.getLogger(myClass.class);
...
}
Run Code Online (Sandbox Code Playgroud)
在getLogger()参数中重复"myClass"似乎是错误的.我想要"getLogger(__ CLASS__)"或"getLogger(this.class)"之类的东西.(我知道这些都很愚蠢,但它们应该指向我正在寻找的东西.)Java编译器在处理源代码时是否真的不知道它在哪个类中?
不幸的是,如果你在一个static环境中就没有更简单的方法(就像你在这里一样).如果记录器是一个实例变量,你可以使用getClass(),但是你必须担心子类.
对于这种特殊情况,另一种方法是使用log5j.log5j是log4j的包装器,带有方便的方法getLogger(),通过向上走栈来推断出正确的类.所以你的代码将成为:
import com.spinn3r.log5j.Logger;
class myClass {
private static final Logger logger = Logger.getLogger();
...
}
Run Code Online (Sandbox Code Playgroud)
并且您可以将相同的声明复制并粘贴到所有类中,而不会出现任何问题.
我抗拒不了.
这是mmyers所指的但是自制的实现:)
基本上你抛出一个异常并获取堆栈的第二个元素来获取类名.
我仍然认为将它作为实例成员更好.
:)
package some.utility.packagename;
import java.util.logging.Logger;
import some.other.packagename.MyClass;
public class LoggerFactory {
public static Logger getLogger() {
StackTraceElement [] s = new RuntimeException().getStackTrace();
return Logger.getLogger( s[1].getClassName() );
}
public static void main (String [] args) {
MyClass a = new MyClass();
}
}
Run Code Online (Sandbox Code Playgroud)
用法:
package some.other.packagename;
import java.util.logging.Logger;
import static some.utility.packagename.LoggerFactory.getLogger;
public class MyClass {
private static final Logger logger = getLogger();
static{
System.out.println(MyClass.logger.getName());
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8292 次 |
| 最近记录: |