Foo :: class.java和Foo :: javaClass有什么区别?

jin*_*ngx 9 kotlin

为了初始化我的记录器显然我需要:

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)


Bak*_*aii 6

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类的KPropertyto 是错误的LoggerFactory.getLogger().