Phương thức getClass(), đối tượng Class và giới thiệu về Reflection - 1

"Chào, Amigo!"

"Bây giờ là lúc cho sự kiện chính. Chúng ta sẽ làm quen với lớp Class và chạm vào Reflection.
Như bạn có thể đã nhận ra, mọi thứ trong Java đều là một đối tượng. Và một đối tượng cần gì? Mỗi đối tượng có gì để định nghĩa nó là tất cả những gì?"

"Một lớp học!"

"Phải! Làm tốt lắm. Mỗi đối tượng có một lớp. Nhưng quay lại với các đối tượng... Một số đối tượng hoàn toàn chứa một thực thể, trong khi những đối tượng khác chỉ giúp quản lý nó."

"Loại thứ hai này bao gồm FileOutputStreamThread . Khi bạn tạo một đối tượng Thread, một luồng mới sẽ không được tạo. Luồng được tạo bởi máy ảo Java sau khi phương thức start() được gọi. Đối tượng này chỉ giúp quản lý quy trình. "

"Tương tự với FileOutputStream : tệp được lưu trữ trên đĩa và HĐH quản lý việc lưu trữ và truy cập. Nhưng chúng ta có thể tương tác với nó thông qua các đối tượng Tệp, một lần nữa với sự trợ giúp của máy ảo Java."

"Vâng, tôi đã hiểu điều đó."

"Vì vậy, có một lớp học đặc biệt gọi là Lớp học để tương tác với các lớp học."

"Điều đó không khó đoán."

"Vâng. Mỗi khi máy ảo Java tải một lớp mới vào bộ nhớ, nó sẽ tạo một đối tượng Lớp mà bạn có thể sử dụng để lấy thông tin cụ thể về lớp đã tải."

"Mỗi lớp và đối tượng được liên kết với một « Đối tượng lớp »."

Ví dụ Sự miêu tả
Class clazz = Integer.class;
Lấy đối tượng Class của lớp Integer.
Class clazz = int.class;
Lấy đối tượng Class của lớp int.
Class clazz = "123".getClass();
Nhận đối tượng Lớp của đối tượng Chuỗi.
Class clazz = new Object().getClass();
Lấy đối tượng Lớp của đối tượng Đối tượng.

"Oa! Thật thú vị!"

"Bạn có nhớ rằng từ lớp là một từ khóa trong Java và không thể được sử dụng làm tên biến không?"

"Ồ vâng, tôi biết, tôi biết. Tôi chỉ quên mất."

"Bạn đã sử dụng đối tượng Class ở đâu chưa?"

"Có, chúng tôi đã sử dụng nó khi chúng tôi viết triển khai phương thức bằng của riêng mình."

"Có, bạn có thể sử dụng phương thức getClass() để kiểm tra xem các đối tượng có cùng lớp hay không."

"Và bạn có thể làm gì với đối tượng này?"

"Chà, rất nhiều thứ:"

mã Java Sự miêu tả
Class s = int.class;
String name = s.getName();
Lấy tên lớp.
Class s = Class.forName("java.lang.String");
Nhận một lớp theo tên.
Object o1 = String.valueOf(1);
Object o2 = 123 + "T";
o1.getClass() == o2.getClass();
So sánh các lớp của đối tượng.

"Thú vị, nhưng không tuyệt như tôi nghĩ."

"Bạn muốn nó ngầu không? Ngoài ra còn có ReflectionReflection siêu ngầu."

" Phản chiếu là gì ?"

" Phản ánh là khả năng của một lớp để lấy thông tin về chính nó. Java có các lớp đặc biệt:  TrườngPhương thức , tương tự như lớp Lớp dành cho các lớp. Giống như các đối tượng Lớp cho phép bạn lấy thông tin về một lớp, các đối tượng Trường cung cấp thông tin về một trường và đối tượng Phương thức cung cấp thông tin về một phương thức. Và hãy xem bạn có thể làm gì với chúng:"

mã Java Sự miêu tả
Class[] interfaces = List.class.getInterfaces();
Nhận danh sách các đối tượng Lớp cho các giao diện của lớp Danh sách
Class parent = String.class.getSuperclass();
Lấy đối tượng Class của lớp cha của lớp String
Method[] methods = List.class.getMethods();
Lấy danh sách các phương thức của lớp List
String s = String.class.newInstance();
Tạo một chuỗi mới
String s = String.class.newInstance();
Method m = String.class.getMethod("length");
int length = (int) m.invoke(s)
Lấy phương thức độ dài của lớp String và gọi nó trên String s

"Chà! Bây giờ điều đó thực sự tuyệt vời!"