为了初始化我的记录器显然我需要:
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类的KPropertyto 是错误的LoggerFactory.getLogger().
| 归档时间: |
|
| 查看次数: |
3487 次 |
| 最近记录: |