Pobieranie typu klasy z String

87

Mam, Stringktóry ma nazwę klasy, powiedz "Ex"(bez .classrozszerzenia). Chcę go przypisać do Classzmiennej, takiej jak ta:

Class cls = (string).class

Jak mogę to zrobić?

Steven
źródło
co jeśli klasa jest w innym projekcie?
Steven
1
Do twojego komentarza: Co! ??? Gdyby twoja klasa była w innym projekcie, czy nie zależałoby to od twojego IDE? Jeśli chodzi o twoją aplikację, to i tak wyglądałoby to tak, jakby była w tym samym projekcie, ponieważ jej biblioteki są przywoływane zewnętrznie. Na przykład wiesz, że w Twoim projekcie nie ma klas Java API, prawda? Ale kompilator twojego IDE wie, gdzie je znaleźć, jeśli twoje IDE jest poprawnie skonfigurowane. To samo dotyczy twoich zajęć z innego projektu.
user919860

Odpowiedzi:

168
Class<?> cls = Class.forName(className);

Ale classNamepowinieneś być w pełni wykwalifikowany - tjcom.mycompany.MyClass

Bozho
źródło
2
rzuca wyjątek ClassNotFound
Steven
1
wówczas klasa nie jest na ścieżce klasy lub nie przechodzą pełną nazwę klasy np com.mycompany.project.ClassName
Hans Westerbeek
jaką wartość classNameprzechodzisz? Czy na Twojej ścieżce zajęć jest taka klasa?
Bozho
tak, klasa jest w tym samym pakiecie
Steven
1
Mam ten sam problem z ClassNotFoundException. Sztuczka polegała na tym, aby obsłużyć wyjątek podczas próby złapania. Coś takiego:try { Class<?> cls = Class.forName("com.company.MyClass"); } catch (ClassNotFoundException ex) { /* do something to handle the case when the string isn't valid and therefor the class can't be found */ }
kumaheiyama
43
String clsName = "Ex";  // use fully qualified name
Class cls = Class.forName(clsName);
Object clsInstance = (Object) cls.newInstance();

Aby uzyskać więcej informacji, zapoznaj się ze ścieżką samouczków Java w Reflection pod adresem http://java.sun.com/docs/books/tutorial/reflect/TOC.html .

JuanZe
źródło
3
Odpowiedź Bozho może mieć więcej punktów, ale myślę, że twoja jest bardziej opisowa. PS. Dlaczego nazywasz się JuanZe ??? Prawie brzmi jak mieszanka hiszpańskiego i chińskiego. :RE. Czy kryje się za tym jakieś sprytne znaczenie?
user919860
Pracuję z projektem internetowym Dynamic w eclipse. Używam powyższego kodu, aby pobrać klasę. ale zwraca ClassNotFoundException, kiedy używam zmiennej łańcuchowej, takiej jak ta: String clsName = "com.mydoamin.className"; Class cls = Class.forName(clsName); Jeśli jako parametr jest zakodowana w pełni kwalifikowana nazwa klasy, wszystko działa dobrze. Jakieś sugestie?
Dibyanshu Jaiswal
8

Możesz skorzystać z forNamemetody Class:

Class cls = Class.forName(clsName);
Object obj = cls.newInstance();
rsp
źródło
Pracuję z projektem internetowym Dynamic w eclipse. Używam powyższego kodu, aby pobrać klasę. ale zwraca ClassNotFoundException, kiedy używam zmiennej łańcuchowej, takiej jak ta: String clsName = "com.mydoamin.className"; Class cls = Class.forName(clsName); Jeśli jako parametr jest zakodowana w pełni kwalifikowana nazwa klasy, wszystko działa dobrze. Jakieś sugestie?
Dibyanshu Jaiswal,
@djthequest Jeśli nasza clsNamezmienna zawiera w pełni kwalifikowaną nazwę klasy, nie powinno być różnicy między jej użyciem a zakodowanym ciągiem. Możesz nie mieć potrzebnej klasy w ścieżce klas. Może pomóc utworzenie wystąpienia wspólnej klasy z tego samego pliku jar w kodzie startowym, aby upewnić się, że biblioteka jest obecna w module ładującym klasy.
rsp
dziękuję za odpowiedź, ale zamiast zmiennej, jeśli zakoduję ciąg znaków, działa fins, oznacza to, że klasy są w ścieżce klas, prawda? Później się zorientowałem, Class.forName()metoda oczekuje finalzmiennej. Prosta zmienna nie zadziała.
Dibyanshu Jaiswal
4

Odwołanie do klasy dowolnej klasy można pobrać w czasie wykonywania za pomocą koncepcji Java Reflection Concept.

Sprawdź poniższy kod. Wyjaśnienie podano poniżej

Oto jeden przykład, który używa zwróconej klasy do tworzenia instancji AClass:

package com.xyzws;
class AClass {
    public AClass() {
        System.out.println("AClass's Constructor"); 
    }  
    static {   
        System.out.println("static block in AClass");  
    }
}
public class Program {   
    public static void main(String[] args) {
        try {       
            System.out.println("The first time calls forName:");   
            Class c = Class.forName("com.xyzws.AClass");      
            AClass a = (AClass)c.newInstance();    
            System.out.println("The second time calls forName:");  
            Class c1 = Class.forName("com.xyzws.AClass"); 
        } catch (ClassNotFoundException e) { 
            // ...
        } catch (InstantiationException e) {  
            // ...
        } catch (IllegalAccessException e) { 
            // ...
        }     
    }
}

Wydruk to

    The first time calls forName:
    static block in AClass
    AClass's Constructor
    The second time calls forName:

Klasa została już załadowana, więc nie ma drugiego „statycznego bloku w AClass”

Wyjaśnienie znajduje się poniżej

Class.ForName jest wywoływana w celu pobrania obiektu klasy

Korzystając z obiektu Class, tworzymy nową instancję klasy.

Wszelkie wątpliwości co do tego daj mi znać

gmhk
źródło
co jeśli klasa jest w innym projekcie?
Steven
1
Czy możesz pobrać plik jar tego proect i określić nazwę klasy, na przykład Class.forName („oracle.jdbc.driver.OracleDriver”)
gmhk
3

Powinno być:

Class.forName(String classname)

Hans Westerbeek
źródło
Czy możesz to zrobić również dla podklas?
Gobliins
2

Nie jestem pewien, o co pytasz, ale ... może imię klasy ?

Manrico Corazzi
źródło
rzucający się wyjątek ClassNotFound
Steven
co jeśli klasa jest w innym projekcie?
Steven
1
Widzę, że nikt nie odpowiada na twoje pytanie. Nie powinno mieć znaczenia, czy jest w innym projekcie, o ile kompilator wie, gdzie szukać. Ponieważ prawdopodobnie używasz IDE, prawdopodobnie zależy to wyłącznie od IDE. Jeśli chodzi o referencje, wiesz, że wszystkich klas, do których odwołujesz się z bibliotek Java, nie ma w twoim projekcie, prawda? Ale kompilator wie, gdzie ich szukać, ponieważ wie, że istnieją odwołania do nich zewnętrznie. Wydaje się, że musisz nauczyć się podstawowego programowania w języku Java, gdy próbujesz zaawansowanego programowania w języku Java. : |
user919860