为了初始化我的记录器显然我需要:
val LOGGER : Logger = LoggerFactory.getLogger(Foo::class.java);
Run Code Online (Sandbox Code Playgroud)
如果我做:
val LOGGER : Logger = LoggerFactory.getLogger(Foo::javaClass);
Run Code Online (Sandbox Code Playgroud)
它抱怨参数类型与之不兼容getLogger
.但是根据API,两者都是Class<Foo>
.他们有什么不同?
s1m*_*nw1 12
这javaClass
是一个扩展属性,它返回实例化对象的运行时Java类.在您的情况下,它被用作属性引用,它将为您提供表示扩展函数本身:KProperty1<Foo, Class<Foo>>
val T.javaClass: java.lang.Class<T>
Run Code Online (Sandbox Code Playgroud)
您可以将它与接收器结合使用,例如,如果Foo
提供了默认构造函数,您可以说:
Foo::javaClass.get(Foo())
Run Code Online (Sandbox Code Playgroud)
可简化为:
Foo().javaClass
Run Code Online (Sandbox Code Playgroud)
::class.java
另一方面,使用直接Class<?>
为"类引用"中描述的Java .一个简单例子中的所有三种可能性:
val kProperty1: KProperty1<Foo, Class<Foo>> = Foo::javaClass
kProperty1.get(Foo()) //class de.swirtz.kotlin.misc.Foo
Foo::class.java //class de.swirtz.kotlin.misc.Foo
Foo().javaClass //class de.swirtz.kotlin.misc.Foo
Run Code Online (Sandbox Code Playgroud)
javaClass
是一个扩展属性,它返回对象的运行时Java类.
/**
* Returns the runtime Java class of this object.
*/
public inline val <T: Any> T.javaClass : Class<T>
@Suppress("UsePropertyAccessSyntax")
get() = (this as java.lang.Object).getClass() as Class<T>
Run Code Online (Sandbox Code Playgroud)
它可以在类的实例上调用,例如:
println(Foo().javaClass) //class Foo
Run Code Online (Sandbox Code Playgroud)
但是,Foo::javaClass
为您提供类型的属性引用KProperty1<Foo, Class<Foo>>
而不是Java类实例,可以使用它来获取Foo
通过反射的实例的类:
val p: KProperty1<Foo, Class<Foo>> = Foo::javaClass
println(p.get(Foo())) //p.get(Foo()) returns a Java class Foo
Run Code Online (Sandbox Code Playgroud)
因此,传递接受Java类的KProperty
to 是错误的LoggerFactory.getLogger()
.
归档时间: |
|
查看次数: |
3487 次 |
最近记录: |