2010-03-09 9 views
57

Posiadam numer String, który ma nazwę klasy: "Ex" (bez rozszerzenia .class). Chcę, aby przypisać ją do zmiennej Class, tak:Uzyskiwanie typu klasy z ciągu znaków

Class cls = (string).class 

W jaki sposób można to zrobić?

+0

co, jeśli klasa jest w innym projekcie? – Steven

+0

Twoja komentarz: What! ??? Jeśli twoja klasa była w innym projekcie, to czy nie byłoby to zależne od twojego IDE? Jeśli chodzi o twoją aplikację, to tak, jakby był on w tym samym projekcie tak czy inaczej, ponieważ jego biblioteki są przywoływane zewnętrznie. Wiesz, że klasy Java API nie są w twoim projekcie, prawda? Ale twój kompilator IDE wie, gdzie je znaleźć, jeśli twój IDE jest poprawnie skonfigurowany. To samo dotyczy twoich zajęć z innego projektu. – user919860

Odpowiedz

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

Ale twój className powinny być w pełni wykwalifikowani - tj com.mycompany.MyClass

+2

Wyrzucanie wyjątku ClassNotFound – Steven

+0

wtedy klasa nie znajduje się w ścieżce klasy lub nie przekazuje w pełni kwalifikowanej nazwy klasy, np. com.mycompany.project.ClassName –

+0

jaka wartość parametru "className" przechodzisz? Czy jest taka klasa w twojej klasie? – Bozho

3

EEH .. Class.forName (classname String)?

+0

Czy możesz to zrobić również dla Subclasses? – Gobliins

2

Nie jestem pewien, o co pytasz, ale ... Class.forname, może?

+0

Wyrzucanie wyjątku ClassNotFound – Steven

+0

co, jeśli klasa jest w innym projekcie? – Steven

+0

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. Coś na temat referencji, wiesz, że wszystkie klasy, które odwołujesz się z bibliotek Java, nie są w twoim projekcie, prawda? Ale kompilator wie, gdzie ich szukać, ponieważ wie, że są one przywoływane zewnętrznie. Wygląda na to, że przy próbie zaawansowanego programowania w języku Java trzeba nauczyć się podstaw programowania w języku Java. : | – user919860

6

Można użyć metody forName z Class:

   Class cls = Class.forName(clsName); 
       Object obj = cls.newInstance(); 
+0

Pracuję z dynamicznym projektem WWW w czasie zaćmienia. Używam powyższego kodu do pobrania klasy. ale zwraca ClassNotFoundException, gdy używam zmiennej łańcuchowej w następujący sposób: 'String clsName =" com.mydoamin.className "; Klasa CLS = Class.forName (clsName); ' Jeśli hardcode pełną nazwę klasy jako parametr następnie wszystko działa prawidłowo. Jakieś sugestie? –

+0

@djthequest Jeśli nasza zmienna 'clsName' zawiera w pełni kwalifikowaną nazwę klasy, nie powinno być żadnej różnicy między używaniem jej a stałym zakodowaniem. Możesz nie mieć klasy, której potrzebujesz w ścieżce klas. Może pomóc utworzyć instancję klasy wspólnej z tego samego słoika w kodzie rozruchowym, aby upewnić się, że biblioteka jest obecna w programie ładującym klasy. – rsp

+0

dziękuję za odpowiedź, ale zamiast zmiennej, jeśli hardcode ciąg, działa płetwy, oznacza to, że klasy są w ścieżce klasy, prawda? Później zorientowałem się, że metoda 'Class.forName()' oczekuje zmiennej 'final'. Prosta zmienna nie zadziała. –

32
String clsName = "Ex"; // use fully qualified name 
Class cls = Class.forName(clsName); 
Object clsInstance = (Object) cls.newInstance(); 

Sprawdzić ślad Java Tutorial na odbicie w http://java.sun.com/docs/books/tutorial/reflect/TOC.html dla dalszych szczegółów.

+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 połączenie hiszpańskiego i chińskiego. :RE. Czy kryje się za tym jakieś sprytne znaczenie? – user919860

+0

@ user919860, Musisz przeczytać go od tyłu. – Pacerier

+0

Pracuję z dynamicznym projektem WWW w czasie zaćmienia. Używam powyższego kodu do pobrania klasy. ale zwraca ClassNotFoundException, gdy używam zmiennej łańcuchowej w następujący sposób: 'String clsName =" com.mydoamin.className "; Klasa CLS = Class.forName (clsName); ' Jeśli hardcode pełną nazwę klasy jako parametr następnie wszystko działa prawidłowo. Jakieś sugestie? –

4

Możesz uzyskać odwołanie do klasy dowolnej klasy w czasie wykonywania, korzystając z koncepcji Java Reflection.

Sprawdź poniższy kod. Explaianation podano poniżej Oto jeden przykład, który używa zwracane klasy do utworzenia 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) { 
       ... }  
     } 
    } 


    The output is 
    The first time calls forName: 
    static block in AClass 
    AClass's Constructor 
    The second time calls forName: 
     //Calss has been loaded so there is not "static block in AClass" printing outThe second 

Exaplaination jest poniżej

Class.forName nazywa uzyskać obiektu klasy

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

Wszelkie wątpliwości na ten temat daj mi znać

+0

co, jeśli klasa jest w innym projekcie? – Steven

+1

Czy można uzyskać plik jar tego produktu i podać nazwę klasy coś takiego jak Class.forName ("oracle.jdbc.driver.OracleDriver") – gmhk

Powiązane problemy