2010-03-09 36 views
57

Tôi có một số String có tên của một lớp nói là "Ex" (không có số .class mở rộng). Tôi muốn chỉ định nó cho biến số Class, như sau:Bắt loại lớp từ Chuỗi

Class cls = (string).class 

Tôi có thể làm như thế nào?

+0

điều gì xảy ra nếu lớp học ở dự án khác? – Steven

+0

Để bình luận của bạn: Cái gì! ??? Nếu lớp học của bạn nằm trong một dự án khác, thì điều đó có phụ thuộc vào IDE của bạn không? Theo như ứng dụng của bạn là có liên quan, nó sẽ được như thể nó đã được trong cùng một dự án anyways bởi vì nó là thư viện được tham chiếu bên ngoài. Giống như, bạn biết rằng các lớp Java API không có trong dự án của bạn, phải không? Tuy nhiên, trình biên dịch cho IDE của bạn biết nơi để tìm chúng, nếu IDE của bạn được thiết lập chính xác. Điều tương tự cũng áp dụng cho các lớp học của bạn từ một dự án khác. – user919860

Trả lời

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

Nhưng className của bạn nên được đầy đủ trình độ - ví dụ: com.mycompany.MyClass

+2

Trường hợp ngoại lệ ClassNotFound ném của nó – Steven

+0

thì lớp học không nằm trên đường dẫn lớp hoặc bạn không chuyển tên lớp học đầy đủ, ví dụ: com.mycompany.project.ClassName –

+0

giá trị của 'className' là bạn đi qua? Có một lớp học như vậy trên classpath của bạn? – Bozho

3

Eeh .. Class.forName (String className)?

+0

Bạn cũng có thể làm điều này cho các lớp con? – Gobliins

2

Không chắc chắn bạn đang hỏi gì, nhưng ... Class.forname, có thể?

+0

Trường hợp ngoại lệ ClassNotFound ném – Steven

+0

nếu lớp học trong dự án khác thì sao? – Steven

+0

Tôi thấy rằng không ai trả lời câu hỏi của bạn. Nó không quan trọng nếu nó trong một dự án khác miễn là trình biên dịch biết nơi để tìm. Vì, có lẽ bạn đang sử dụng một IDE, nó có thể chỉ phụ thuộc vào IDE. Điều về tài liệu tham khảo, bạn biết rằng tất cả các lớp mà bạn tham chiếu từ các thư viện Java không nằm trong dự án của bạn, đúng không? Nhưng, trình biên dịch biết nơi để tìm chúng bởi vì nó biết rằng chúng được tham chiếu từ bên ngoài. Dường như bạn cần học lập trình Java cơ bản khi bạn đang cố gắng lập trình Java nâng cao. : | – user919860

6

Bạn có thể sử dụng phương pháp forName của Class:

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

Tôi đang làm việc với dự án web động trong nhật thực. Tôi đang sử dụng mã trên để lấy một Class. nhưng nó trả về ClassNotFoundException, khi tôi sử dụng một biến chuỗi như sau: 'String clsName =" com.mydoamin.className "; cls Class = Class.forName (clsName); ' Nếu là hardcode tên lớp đầy đủ như các tham số sau đó mọi thứ hoạt động tốt. Bất kì lời đề nghị nào? –

+0

@djthequest Nếu biến 'clsName' của chúng ta chứa tên lớp đầy đủ thì không có sự khác biệt giữa việc sử dụng nó và chuỗi được mã hóa cứng. Bạn có thể không có lớp bạn cần trong classpath. Nó có thể giúp khởi tạo một lớp chung từ cùng một jar trong mã khởi động của bạn để đảm bảo thư viện có mặt trong trình nạp lớp. – rsp

+0

cảm ơn phản hồi của bạn, nhưng thay vì biến nếu tôi mã hóa chuỗi, làm việc vây, có nghĩa là các lớp nằm trong đường dẫn lớp, phải không? Sau đó tôi đã tìm ra phương thức 'Class.forName()' mong đợi biến 'final'. Một biến đơn giản sẽ không hoạt động. –

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

Kiểm tra đường mòn Java Tutorial trên Reflection tại http://java.sun.com/docs/books/tutorial/reflect/TOC.html để biết thêm chi tiết.

+3

Câu trả lời của Bozho có thể có nhiều điểm hơn, nhưng tôi nghĩ rằng câu trả lời của bạn mang tính mô tả hơn. PS. Tại sao tên của bạn là JuanZe ??? Hầu như âm thanh như một sự pha trộn giữa Tây Ban Nha và Trung Quốc. : D. Có một số loại ý nghĩa thông minh đằng sau nó? – user919860

+0

@ user919860, Bạn cần đọc nó ngược. – Pacerier

+0

Tôi đang làm việc với dự án web động trong nhật thực. Tôi đang sử dụng mã trên để lấy một Class. nhưng nó trả về ClassNotFoundException, khi tôi sử dụng một biến chuỗi như sau: 'String clsName =" com.mydoamin.className "; Class cls = Class.forName (clsName); ' Nếu mã hóa tên lớp đủ điều kiện làm tham số thì mọi thứ hoạt động tốt. Bất kì lời đề nghị nào? –

4

Bạn có thể lấy tham chiếu Lớp của bất kỳ lớp nào trong thời gian chạy sẽ thông qua Khái niệm phản chiếu Java.

Kiểm tra mã bên dưới. Explaianation được đưa ra dưới đây Dưới đây là một ví dụ sử dụng trở lại lớp để tạo ra một thể hiện của 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 

Các Exaplaination dưới

Class.forName được gọi là để có được một đối tượng lớp

Bằng cách sử dụng đối tượng lớp, chúng tôi đang tạo phiên bản mới của Lớp.

Bất kỳ nghi ngờ nào về điều này cho tôi biết

+0

nếu lớp học trong dự án khác thì sao? – Steven

+1

Bạn có thể lấy một tập tin jar của chương trình đó và chỉ định tên lớp một số thứ như Class.forName ("oracle.jdbc.driver.OracleDriver") – gmhk

Các vấn đề liên quan