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ć?


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


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 .


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();

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ć


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


2

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


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.