So finden Sie den Paket-Namen der name einer Klasse?
Einem gegebenen Klassennamen als string, wie bekomme ich die package-Namen der es zur Laufzeit ? Ich habe nicht den vollständig qualifizierten Namen mit der Paketname + Klassenname. Einfach nur den Namen der Klasse.
Möchte ich die package-Namen verwendet werden Class.forName()
Methode.
Ich bin völlig in Ordnung mit der Suche nach der ersten passenden Paket-Namen (falls mehrere Pakete die gleiche Klasse).
Irgendwelche Ideen?
UPDATE
Ich NICHT über eine Instanz der Klasse zu arbeiten. Meine Forderung ist, eine Klasse zu erstellen mit der Class.forName()
Methode. Aber ich habe einfach NUR den Namen der Klasse als string. Ich brauche einige Weg, um die Schleife, obwohl die Pakete und zu identifizieren, wenn die Klasse, ich habe gehört das Paket.
Den stack-trace der exception
Exception in thread "main" java.lang.ClassNotFoundException: MyAddressBookPage
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:169)
- Sie brauchen nicht eine Klasse-Instanz-Klasse.Vorname zu arbeiten. Lesen Sie die Kommentare in meiner Antwort
- Warum sind Sie der Abstimmung alle down? Wir versuchen nur zu helfen. Wenn jeder gibt ähnliche Antworten dann bedeutet es, dass Sie nicht in der Lage dein problem zu beschreiben, gut und es ist Eure Schuld in den ersten Platz..
- Ein Beispiel, was du meinst in Bezug auf die Klassennamen vs fully qualified class name kann hilfreich sein bei der Aufklärung der Verwirrung, z.B. "ich habe nur 'Baz', ich don T haben 'com.foo.bar.Baz'.
- es ist nicht ihm, sondern an mir. Ich bin voting ab, weil Sie nicht die Beantwortung seiner Frage. Nehmen Sie es nicht persönlich! 🙂 Wenn Sie erst einmal bearbeitet werden, um sinnvolle Antworten ich werde gehen Sie zurück und entfernen Sie die downvote, wo es nicht mehr anwenden. Aber derzeit sind einfach nicht gut Antworten. So starten wir die Reise von keine Antwort, um beste Antwort auf das web. Wieder, nehmen Sie es nicht persönlich.
- Es war nicht ich, der nach unten stimmten die Antworten.
- sorry für das Missverständnis. Es ist ein bisschen einschüchternd, um zu sehen, meine ohnehin schon niedrige ansehen gehen. @Grundlefleck vielen Dank für die Beantwortung. 😉
- Im Allgemeinen versuche ich zu vermeiden, nach unten Abstimmung, sondern weil es so viele ähnlich falschen Antworten, keine Antworten von Ihnen positiv bewertet werden, und ich fand die Frage ganz klar, ich fühlte es war die richtige Wahl. Leider konnte ich nicht erkennen, es gibt ein Zeitlimit auf die Beseitigung der downvote, so kann ich nicht rückgängig machen, gibt es jetzt einige Antworten von Ihnen positiv bewertet werden. Tut mir Leid, dass.
- Wenn ich richtig raten, können Sie upvote Sie nach einer Bearbeitung.
- Sieht aus wie das der Fall ist. Nun gibt es vernünftige Antworten, die ich von Ihnen positiv bewertet werden wird, entfernen Sie die downvotes, wo ich kann (einige benötigen noch Bearbeiten, wie du sagst).
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist wahrscheinlich eine unglaublich ineffizient, aufgebläht, unbequem, Weise, das zu tun, was Sie zu erreichen versuchen, und hoffentlich gibt es bereits eine out-of-the-box, der einzige Weg, es zu tun... aber es sollte funktionieren.
Grundsätzlich scan durch jede Klasse im class-path, bis Sie finden, eine Klasse, wo
getSimpleName()
entspricht der name der Klasse, die Sie haben.Ich empfehlen, sich auf Google Classpath Explorer um die Muttern und Schrauben, dies zu tun.
Könnte es wie folgt Aussehen:
resources
ist ein array von Strings wie 'com/foo/bar/Baz.class'. Du kannst nun einfach eine Schleife durch und finden Sie passende Einträge, und transformieren Sie Sie aus, aufgeschlitzt, um punktiert, Streifen heraus".Klasse', etc. Nur vorsichtig sein, um, der versucht, innere Klassen, wie Sie ein " $ " - Zeichen in Ihnen.Auch, soweit ich informiert bin, wird dies NICHT verursachen diese Klassen geladen werden.
findResources()
nimmtrootPackageName
aber wenn ich es lade alles drin (also "com.foo.bar" oder "com/foo/bar") der code ausgeführt wird, aberresources
kommt leer wieder zurück. Jede Idee, was könnte hier Los?rootPackageName
ist "com/foo/bar". Ich noch nicht in meiner Android-Anwendung, war aber in der Lage, um es arbeiten kein problem in einem normalen Java-Anwendung. Ich Frage mich, ob es etwas über Android, die dies verhindern arbeiten. Irgendwelche Ideen?packages
array.Der einzige Weg wäre, um zu navigieren in den Verzeichnissen/jars in den classpath und einen Eintrag mit den Namen der Klasse.
Hier ist etwas code, der fast funktioniert wie Sie soll. Dieser code ist Teil einer Klasse, ich habe diese sucht nach Implementierungen/factory-Methoden zur Erzeugung von Instanzen von Schnittstellen. Sorry, habe nicht die Zeit, dies zu ändern, suchen Sie für eine benannte Klasse, eine leichte Veränderung, und wie ich schon an anderer Stelle erwähnt brauchen Sie nicht, um die Klasse laden, überprüfen Sie einfach die Namen.
Einer der einfachsten Lösung:
"ArrayList"
müssen Sie den Namen des Pakets, zum Beispiel"java.util"
Call getPackageName() auf der Klasse. Es gibt den vollqualifizierten package-Namen. Auch ist es erwähnenswert, dass dies ist ein Java-9-feature.