2017-10-08 1 views
4

Zu meinem Logger zu initialisieren offenbar ich brauche:Was ist der Unterschied zwischen Foo :: class.java und Foo :: javaClass?

val LOGGER : Logger = LoggerFactory.getLogger(Foo::class.java); 

Wenn ich tun:

val LOGGER : Logger = LoggerFactory.getLogger(Foo::javaClass); 

Es beschwert sich, dass der Parameter-Typ mit getLogger nicht kompatibel ist. Gemäß der API sind jedoch beide Class<Foo>. Wie sind sie anders?

Antwort

5

Die javaClass definiert ist, ist eine Erweiterung Eigenschaft, die die Runtime-Java-Klasse eines instanziiert Objekt zurückgibt. In Ihrem Fall wird es als Eigenschaft Referenz verwendet, die Ihnen ein KProperty1<Foo, Class<Foo>> repräsentieren die Erweiterungsfunktion selbst geben:

val T.javaClass: java.lang.Class<T> 

Man könnte dies mit einem Empfänger in Kombination verwendet werden, zum Beispiel wenn Foo einen Standardkonstruktor bereitgestellt könnte man sagen:

Foo::javaClass.get(Foo()) 

, die vereinfacht werden kann:

Foo().javaClass 

Mit ::class.java auf der anderen Seite, gibt Ihnen die Java Class<?> wie in "class references" direkt beschrieben. Alle drei Möglichkeiten in einem einfachen Beispiel:

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 
2

Foo::javaClass ist ein Verweis auf eine val definiert als

inline val <T : Any> T.javaClass: Class<T> 

So würden Sie es auf einer Instanz von Foo wie foo.javaClass nennen müssen.

Foo::class gibt Ihnen die tatsächliche KClass von Foo und java eine Eigenschaft von KClass als

val <T> KClass<T>.java: Class<T> 
4

javaClass ist eine Erweiterung Eigenschaft, die die Laufzeit-Java-Klasse eines Objekts zurückgibt.

/** 
* 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> 

Es kann auf eine Instanz einer Klasse aufgerufen werden, zum Beispiel:

println(Foo().javaClass) //class Foo 

jedoch Foo::javaClass Sie geben ein property reference vom Typ KProperty1<Foo, Class<Foo>> anstelle einer Instanz Java-Klasse, die verwendet werden können, zu erhalten die Klasse von einer Instanz von Foo durch Reflexion:

val p: KProperty1<Foo, Class<Foo>> = Foo::javaClass 
println(p.get(Foo())) //p.get(Foo()) returns a Java class Foo 

Daher ist es falsch, einpassieren 210 bis LoggerFactory.getLogger(), die eine Java-Klasse akzeptiert.

Verwandte Themen