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.