Genau so war bzw. ist das: Nachdem inzwischen einige Jahre ins Land gegangen sind, möchte ich diesen Thread nochmal nach vorne holen.Illuvatar hat gesagt.:Hm das setzt aber voraus dass der Klassenname zur Compilezeit bekannt ist und ich fürchte, dass das das Problem ist...
Schönen Dank schonmal für die fixe Antwort.SlaterB hat gesagt.:wenn die Klasse nicht bekannt ist, kein Objekt davon oder sonst irgendwas,
nun dann kann man aus dem Nichts auch nixherzaubern
Thread.currentThread().getStackTrace()
Beni hat gesagt.:...das resultierende SackTraceElement
Verjigorm hat gesagt.:SackTraceElement???Beni hat gesagt.:...das resultierende SackTraceElement
Mmh, ich hab das jetzt auf die Schnelle natürlich noch nicht durchgelesen, daher mal eine Vorab-Frage: enthält das Papier eine Möglichkeit, tatsächlich an den Namen zu kommen, oder geht es mehr darum, mich von meinem Vorhaben abzubringen, das Programm wie gewünscht einzusetzen ;-) ?Der Müde Joe hat gesagt.:Strategy Pattern vielleicht?
Polymorphie?fehlerfinder hat gesagt.:Hintergrund:
Mein Programm soll abhängig vom Klassennamen (leicht) unterschiedliche Dinge tun. Als "ClassNormal" soll es regelmäßig laufen und als "ClassSpezial" möchte ich es manuell aufrufen. Um jetzt möglichst wenig im Programmcode ändern zu müssen, möchte ich die "speziellen" Dinge in einem if-Block abhängig vom Klassennamen verarbeiten.
Kennt da jemand eine Möglichkeit?
da du keine Frage gestellt hast bezog ich mich auf die vorherigen Posts,fehlerfinder hat gesagt.:Schönen Dank schonmal für die fixe Antwort.SlaterB hat gesagt.:wenn die Klasse nicht bekannt ist, kein Objekt davon oder sonst irgendwas,
nun dann kann man aus dem Nichts auch nixherzaubern
Aber warum ist die Klasse nicht bekannt?
Ok - so ist das, wenn einem selbst völlig klar ist, was gemeint ist...SlaterB hat gesagt.:da du keine Frage gestellt hast bezog ich mich auf die vorherigen Postsfehlerfinder hat gesagt.:Aber warum ist die Klasse nicht bekannt?
nee - soweit wollte ich auch nicht gehen...SlaterB hat gesagt.:also den StackTrace kann man meines Wissens nach nicht nachbilden
Genau DAS wäre(!) das Statement meiner Wahl. Na gut, dann eben nicht :schmollSystem.out.println(ich bin gerade in ..);
System.out.println(MyClass.class)
Es reicht nicht, weil ich faul bin (puh, endlich ist es raus...). Ich möchte eben nur (im Sinne von "ausschließlich") den Klassennamen ändern, also ausms hat gesagt.:was anso verkehrt ist bzw. dass es deinen Anforderungen nicht reicht.Code:System.out.println(MyClass.class)
public class KlasseNormal
public class KlasseSpezial
...aber der ist halt faul...Derjenige, der den Code vor Augen hat weiss ja um welche Klasse es sich handelt.
...und Faule haben da u.U. ganz andere Prioritäten...Ist doch völlig sinnlos dafür eine eigene Funktion von der JVM bzw. Api zu verlangen.
Das hängt dann davon ab, ob ich mich im NormalZustand.java befinde, oder im IchHabGeradeEineLangeNachtHinterMirZustand.java :bahnhof:Oder findest du auf die Frage wer du selbst bist auch manchmal keine Antwort ohne in den Spiegel, ein Foto oder den Reisepass zu sehen?
fehlerfinder hat gesagt.:Ok - so ist das, wenn einem selbst völlig klar ist, was gemeint ist...SlaterB hat gesagt.:da du keine Frage gestellt hast bezog ich mich auf die vorherigen Postsfehlerfinder hat gesagt.:Aber warum ist die Klasse nicht bekannt?
Also - 2. Versuch:
In dem Augenblick, in dem ich eine Klassendatei habe - z.B. KlassenName.java - müsste ich doch eigentlich auch den zuhörigen Klassen-Namen ("KlassenName") ermitteln können. Eine Klasse existiert doch in dem Augenblick, in dem ich das übersetzte Programm mit "java KlassenName" aufrufe. Dann habe ich noch keine Objekte, kann also auch nicht darüber auf den Namen zugreifen, aber ich habe die Klasse.
Die Möglichkeit, über getStackTrace() an die Info zu kommen zeigt, dass es geht, erscheint mir aber noch nicht so richtig gelungen bzw. so ein wenig "hintenrum".
Vielleicht gibt es da noch eine schönere Möglichkeit...
Frage: Gibt es noch eine schönere Möglichkeit? ;-)
fehlerfinder hat gesagt.:Die Möglichkeit, über getStackTrace() an die Info zu kommen zeigt, dass es geht, erscheint mir aber noch nicht so richtig gelungen bzw. so ein wenig "hintenrum".
Eine Klasse ist zur Ausführungszeit mehr als nur eine abstrakte Struktur. Sie hält sehrwohl Informationen über sich selbst, deren Methoden und Felder (auch statische).Anonymous hat gesagt.:Eine Klasse selbst ist zur Ausführungszeit eigentlich nur eine "abstrakte" Struktur die Variablen und Methoden zusammen fasst. Ähmmm, wo wollte ich drauf raus .... Ja also eine statische Methode hat keinen wirklichen Bezug zur Klasse, sie steht da zwar drin aber das ist wohl eher als eine technische Notwendigkeit, damit du die Methode aufrufen (adressieren) kannst. In Java muss ja alles immer in einer Klasse sein. (schau dir dazu mal C/C++ im Vergleich an). Die Methode "nutzt" Quasi nur den Namensraum der Klasse.
Ja, sowas hatte ich mir als "Ersatzmöglichkeit" auch schonmal überlegt. Dann würden allerdings beide Klassen gleich heißen und ich wollte unter allen Umständen ausschließen, dass die "Spezial"-Variante versehentlich über den "Normal"-Klassennamen aufgerufen wird (ich bin nicht nur faul (bin ich eigentlich gar nicht, sonst würde ich mich ja nicht so damit geschäftigen...), sondern auch manchmal ein wenig zerstreut. Und deswegen soll es die "Spezial"-Funktion nur in der Klasse mit dem "Spezial"-Namen geben.Beni hat gesagt.:"java MeinProgramm normal"
Meine "Entwicklungsumgebung" heißt vi (für alle Windows-Ausschließlich-Nutzer: ein Texteditor). Das geht mir immer noch am schnellsten von der Hand (hab eh nichts mit GUIs zu tun). Aber du hast natürlich Recht. Wenn ich einen String auf "KlasseNormal" oder "KlasseSpezial" setze, kann ich mit equals genau meinen speziellen Code-Block abfragen. Wäre auch noch eine Lösung, mit der ich per "suchen & ersetzen" arbeiten könnte.ms hat gesagt.:Refactoring-Funktion zB. in Eclipse
"Denksportaufgabe" trifft's schon ganz gut. Ich denke mir halt, es müsste doch eigentlich möglich sein. Und von "wirr" kann ja auch keine Rede sein. Das kommt schon alles klar rüber.Anonymous hat gesagt.:Falls du das als kleine Denksportaufgabe siehst[...]Eigenschaften von Instanzen/Klassen/Heap/Stack beschäftigen. Dann wird mein wirres Zeugs hier vielleicht einwenig klarer.
public class InjectingClassLoader extends ClassLoader
{
protected Class loadClass(String name, boolean resolve)
{
Class clazz = super.loadClass(name, resolve);
// bestimme hier welche Klasse injected wird.
// Elegantere Alternative wäre das markieren der Klasse oder des Felds mittels einer Annotation
// deren Existenz hier überprüft werden könnte.
if ( clazz.getName().equals("Test") )
{
// inject via reflection clazz auf statisches Feld Test.currentClass
clazz.getField("currentClass").set(null,clazz);
}
return clazz;
}
}
public class Test {
public static Class currentClass;
public static void willBeCalled()
{
System.out.println(currentClass.getName());
}
}
public class Launcher {
public static void main(String[] args)
{
ClassLoader loader = new InjectingClassLoader();
Test test = (Test)loader.loadClass("Test", true).newInstance();
test.willBeCalled();
}
}