Tôi có một String
cái tên của một lớp nói "Ex"
(không có .class
phần mở rộng). Tôi muốn gán nó cho một Class
biến, như sau:
Class cls = (string).class
Làm thế nào tôi có thể làm điều đó?
Tôi có một String
cái tên của một lớp nói "Ex"
(không có .class
phần mở rộng). Tôi muốn gán nó cho một Class
biến, như sau:
Class cls = (string).class
Làm thế nào tôi có thể làm điều đó?
Câu trả lời:
Class<?> cls = Class.forName(className);
Nhưng bạn className
phải hoàn toàn đủ điều kiện - tức làcom.mycompany.MyClass
className
bạn đang vượt qua giá trị nào? Có một lớp như vậy trên classpath của bạn không?
ClassNotFoundException
. Bí quyết là xử lý ngoại lệ trong một lần thử bắt. Một cái gì đó như thế này: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 */ }
String clsName = "Ex"; // use fully qualified name
Class cls = Class.forName(clsName);
Object clsInstance = (Object) cls.newInstance();
Kiểm tra đường dẫn Hướng dẫn Java về Phản chiếu tại http://java.sun.com/docs/books/tutorial/reflect/TOC.html để biết thêm chi tiết.
String clsName = "com.mydoamin.className"; Class cls = Class.forName(clsName);
Nếu mã cứng là 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?
Bạn có thể sử dụng forName
phương pháp Class
:
Class cls = Class.forName(clsName);
Object obj = cls.newInstance();
String clsName = "com.mydoamin.className"; Class cls = Class.forName(clsName);
Nếu mã cứng là 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?
clsName
biến của chúng ta chứa tên lớp đủ điều kiện thì không có sự khác biệt giữa việc sử dụng nó và chuỗi mã cứng. Bạn có thể không có lớp bạn cần trong classpath. Nó có thể hữu ích để 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 rằng thư viện có trong trình nạp lớp.
Class.forName()
phương thức mong đợi một final
biến. Một biến đơn giản sẽ không hoạt động.
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 thông qua Khái niệm phản chiếu Java.
Kiểm tra mã bên dưới. Giải thích được đưa ra dưới đây
Đây là một ví dụ sử dụng Lớp được trả về để tạo một phiên bả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) {
// ...
}
}
}
Đầu ra được in là
The first time calls forName:
static block in AClass
AClass's Constructor
The second time calls forName:
Lớp đã được tải nên không có "khối tĩnh trong AClass" thứ hai
Giải thích bên dưới
Class.ForName được gọi để lấy 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 một phiên bản mới của Lớp.
Bất kỳ nghi ngờ về điều này cho tôi biết
Nó phải là:
Class.forName(String classname)
Không chắc bạn đang hỏi gì, nhưng ... Class.forname , có thể không?