有人应该在java中使用ClassName.class

时间:2017-07-29 06:33:49

标签: java

我经常看到有人写

assertThat(Long.valueOf(1), instanceOf(Integer.class));

但我无法弄清楚,为什么以及何时应该在java代码中使用ClassName.class(示例Integer.class)

我尝试使用https://docs.oracle.com/javase/tutorial/reflect/资源,但仍难以理解。

2 个答案:

答案 0 :(得分:1)

实际上调用ClassName.class很受欢迎,例如在获取记录器时,在这种情况下,方法需要参数Class<?> clazz,为LoggerFactory

public static Logger More ...getLogger(Class<?> clazz) {
   Logger logger = getLogger(clazz.getName());
   ...

我们只需使用ClassName.class

即可发送

请参阅answers about getLogger by class

  

我通常做的是

     

private static final Logger logger = LoggerFactory.getLogger(ClassName.class);

或其他:

  

我更喜欢

     

Logger logger = LoggerFactory.getLogger(ClassName.class);

答案 1 :(得分:0)

我对https://github.com/stanfordnlp/CoreNLP/issues/103#issuecomment-157793500匹配断言的框架并不过分熟悉,但这似乎来自Hamcrest。 assertThat测试函数的契约是它希望参数1是值,参数2是类类型的实例,如果参数类型2是参数类型2,则返回true,否则返回false。

所以ClassName.class是实际的类(通过反射我猜是对类的名称的引用),instanceOf生成该类的实例,因此instanceOf(ClassName.class)传递类的实例以检查参数1是相同的类型。

总体动机是测试断言Long 1的值是原始int的Integer包装类的实例。我猜在示例中会返回false。

嗯,我认为这是有道理的。