2016-03-31 6 views
0

Nun, der Titel sagt das meiste davon. Ich suchte und die meisten Leute antworten nicht wirklich, was ich versuche zu bekommen. In Minecraft-Plugins machen Sie Jar of Code, die von Bukkit/Spiggot ausgeführt werden. Wenn ich eine statische Klasse erzeuge, die in mehreren Gläsern verwendet wird, aber innerhalb desselben Programms (Bukkit), so dass sie statisch agieren und Daten teilen?Gelangen statische Klassen, die in verschiedenen Gläsern desselben Programms verwendet werden, auf dieselben Daten zu?

+0

Ziemlich sicher ist die Antwort * nein *. Ihr Programm ist das * .jar *. Sie sind alle verschiedene Programme. – Gendarme

+0

Es hängt vom Anwendungsframework ab und ob ein ClassLoader verwendet wird. Einige Beispiele für Frameworks, die ClassLoader-Klassen verwenden: JBoss AS, WebSphere. Einige Frameworks, die dies nicht tun: Raw JVM, Struts. – PaulProgrammer

+0

@Gandarme: "Programm"! = "Glas". Ein Programm verwendet Gläser und manchmal wird es in einem Glas gesammelt, aber zu sagen, dass ein Programm ein Glas ist, ist ein schreckliches Missverständnis. – PaulProgrammer

Antwort

2

Öffentliche Klassen, die vom selben Klassenlader geladen wurden, unabhängig davon, wo sie definiert sind (gleich oder verschieden .jar, .class, usw.), sind im selben Umfang, was bedeutet, dass sie aufeinander zugreifen können.

+0

Dies ist ideal zum Überschreiben von allem, was überschrieben werden kann. : D Das hat keinen Sinn, ich weiß, denk einfach darüber nach. – Lightspeed360

1

Die Antwort ist "vielleicht".

In einer unformatierten JVM wird die static Klasse von einem universellen ClassLoader geladen, sodass sich alle Verweise auf diese statische Klasse auf dieselben Daten beziehen, die in den statischen Membern dieser Klasse gespeichert sind.

In komplizierteren Frameworks segmentieren ClassLoader-Objekte die Zugänglichkeit von Daten zwischen Anwendungskomponenten. In diesem Fall können zwei separate Komponenten unterschiedliche Referenzen auf die "gleiche" Klasse haben. Die Regeln hier werden knifflig, weil sie schwer zu verstehen sind und weil manchmal Fehler zwischen den Komponentenbereichen auftreten können oder auch nicht. Oder es gibt eine Bereichsgrenze, die Sie nicht erwarten.

+0

Also, in der Verwendung von Bukkit, wo Sie Ihre Plugins kompilieren, dann lädt Bukkit die Gläser, würde es funktionieren? –

+0

Ich bin nicht sicher, was Bukkit in dieser Hinsicht tut. – PaulProgrammer

+0

Was meinst du "statische" Klasse? 'Static' ist nur ein akzeptables Schlüsselwort für die Klasse, wenn es um innere Klassen geht, die keinen Zugriff auf ihre enthaltene Instanz haben. Ihre erste Aussage ist falsch. Es gibt auch keinen "Universal Classloader". – Samuel

3

Jar-Dateien sind in Java keine Einheit für das Scoping oder die Kapselung. Sie sind einfach Quellen, von denen eine ClassLoader Klassen und Ressourcen laden kann, und die zusätzliche Metadaten tragen können. Java-Code hat keinen (direkten) Sinn für das Jar, falls vorhanden, aus dem eine bestimmte Klasse geladen wurde, und sobald sie geladen sind, sind die Klassen global für die VM *.

Angenommen, alle betreffenden Klassen werden durch die gleichen oder entsprechend verwandten ClassLoader s geladen, gibt es höchstens einen in der VM für jeden einzelnen vollqualifizierten Klassennamen und alle Verweise auf jeden Klassennamen beziehen sich auf die gleiche Klasse. Wenn diese Klasse statische Variablen hat, werden sie unter allen Objekten geteilt, die auf die Klasse zugreifen.

* Klassen sind jedoch durch die ClassLoader, die sie geladen hat, zugeordnet, so dass unterschiedliche Klassen mit demselben Namen in einer VM vorhanden sein können. Obwohl ich die Implementierungsdetails von Minecraft nicht kenne, scheint es unwahrscheinlich, dass diese Fähigkeiten genutzt werden.