THỰC ĐƠN

Phản chiếu trong Java rất dễ dàng

mục lục

Phản chiếu trong Java rất dễ dàng

Javasự phản xạPhần này giới thiệu các lớp tiện ích giúp việc sử dụng API trở nên dễ dàng hơn.

Phản chiếu là gì?

API phản chiếurăng,"java.lang.reflectNó đã được bao gồm trong gói sản phẩm.
API này truy xuất thông tin như các trường và phương thức từ các lớp Java.
Chúng ta chủ yếu sẽ sử dụng các lớp sau.

  • java.lang.Class
  • java.lang.reflect.Constructor
  • java.lang.reflect.Method
  • java.lang.reflect.field

sự phản xạSử dụng phương pháp này, bạn có thể tránh việc trực tiếp lập trình việc tạo lớp và gọi phương thức.
Bạn có thể tạo các thể hiện của lớp và thực thi các phương thức từ chuỗi ký tự.

Bằng cách định nghĩa tên lớp và tên phương thức trong các tệp bên ngoài như XML, các ứng dụng có thể được điều chỉnh linh hoạt để thích ứng với những thay đổi trong môi trường thời gian chạy.
Hơn nữa, đây là một API rất hiệu quả để xây dựng các ứng dụng có tính linh hoạt cao.


Mục đích của sự suy ngẫm

sự phản xạMặc dù người dùng không thường xuyên sử dụng trực tiếp chức năng này,
Nó được sử dụng rộng rãi trong các ứng dụng web như Struts và trong các framework như O/R mapping.

Ví dụ, khi bạn muốn tự động thiết lập dữ liệu đầu vào từ màn hình web vào các thuộc tính của JavaBeans,
Ví dụ, điều này được sử dụng khi thực hiện các truy vấn SQL để tự động cập nhật các thuộc tính của JavaBeans.

Hơn nữa, các tính năng như tải và đăng ký động các plugin giúp mở rộng chức năng của ứng dụng khi khởi động cũng có sẵn.sự phản xạĐiều này có thể dễ dàng đạt được bằng cách sử dụng [phương pháp này].

Thực thi ví dụ

Giờ thì hãy chạy đoạn mã mẫu và tự mình trải nghiệm lập trình dựa trên framework nhé.

Ở đây chúng ta sẽ sử dụng các lớp sausự phản xạĐây là một cách đơn giản để sử dụng tiện ích này.

Main.java...Lớp cần thực thi
BeanUtil.java...Lớp tiện ích phản chiếu
FreeSoft.java...Đây là một lớp đại diện cho phần mềm tự do và được sử dụng như một hình thức phản chiếu.

●Khi được thực hiện như thường lệ

System.out.println(“">>>Trường hợp bình thường"”);
FreeSoft freeSoft = new FreeSoft();
freeSoft.setName(Trò chuyện & Nhắn tin - Cả trò chuyện và nhắn tin nữa!!)“);
freeSoft.showName();
freeSoft.showPrice(0);

●Khi được thực thi bằng cách sử dụng phản chiếu

System.out.println(>>>Khi sử dụng phản chiếu)“);
// Tạo một thể hiện của lớp FreeSoft
Object invokeObject = BeanUtil.newInstance("Phần mềm miễn phí")“);
// Đặt giá trị cho trường tên.
BeanUtil.setProperty(invokeObject, “"tên"” , “"Trò chuyện & Nhắn tin - Cả trò chuyện và nhắn tin nữa!!"”);
// Thực thi phương thức showName() của FreeSoft.
BeanUtil.invoke(invokeObject, “showName”, vô giá trị);
// Thực thi phương thức showPrice() của FreeSoft.
// Nếu phương thức có tham số, chúng phải được truyền dưới dạng một mảng kiểu Object.
BeanUtil.invoke(invokeObject, “showPrice”,new Object[]{new Integer(0)});

●Kết quả thực thi

Kết quả thực thi sẽ giống nhau cho dù bạn sử dụng reflection hay không.

>>>Trường hợp bình thường

Tên phần mềm: Chat&Messenger (Trò chuyện và nhắn tin)!

Giá: 0 yên

>>>Khi sử dụng phản chiếu

Tên phần mềm: Chat&Messenger (Trò chuyện và nhắn tin)!

Giá: 0 yên

Chi tiết phương thức BeanUtil

newInstance

public static Object newInstance(String className) ném ra ngoại lệ
Thao tác này tạo và trả về một thể hiện từ chuỗi "className".

Thông số:
tên lớp - Tên lớp học đủ điều kiện
Giá trị trả về:
Một thể hiện mới của tên lớp đủ điều kiện.
ngoại lệ:
Ngoại lệ

newInstance

public static Object newInstance(String className, Object[] argObj) throws Exception
Thao tác này tạo và trả về một thể hiện từ chuỗi "className".

Thông số:
tên lớp - Tên lớp học đủ điều kiện
argObj – Tham số khởi tạo
Giá trị trả về:
Một thể hiện mới của tên lớp đủ điều kiện.
ngoại lệ:
Ngoại lệ

newInstance

public static Object newInstance(Lớp clazz) ném ra ngoại lệ
Thao tác này tạo và trả về một thể hiện từ lớp "clazz".

Thông số:
Clazz - lớp học
Giá trị trả về:
Một trường hợp mới của clazz
ngoại lệ:
Ngoại lệ

newInstance

public static Object newInstance(Class clazz, Object[] argObj) throws Exception
Thao tác này tạo và trả về một thể hiện từ lớp "clazz".

Thông số:
Clazz - lớp học
argObj – Tham số khởi tạo
Giá trị trả về:
Một trường hợp mới của clazz
ngoại lệ:
Ngoại lệ

đặt thuộc tính

public static void đặt thuộc tính(Object invokeObject, String fieldName, Object value) throws Exception
Phương thức setter của trường "fieldName" thuộc đối tượng "invokeObject" được gọi để lưu trữ giá trị "value".

Nếu không có phương thức setter, giá trị sẽ được gán trực tiếp cho trường. Tuy nhiên, trong trường hợp này, thuộc tính mục tiêu phải có thuộc tính public.

Thông số:
InvokeObject - Đối tượng cần được thực thi
Tên trường – Tên thuộc tính của đối tượng cần được thực thi
Khuyến khích – Giá trị cần thiết lập
ngoại lệ:
Ngoại lệ – Lỗi sau đây xảy ra:
InvocationTargetException - Khi phương thức cơ bản ném ra một ngoại lệ
Ngoại lệ truy cập bất hợp pháp – Đối tượng Phương thức này là Java
Nếu cơ chế kiểm soát truy cập ngôn ngữ được triển khai và phương thức cơ bản không thể truy cập được.
NoSuchMethodException - Nếu không tìm thấy phương thức có tên được chỉ định

lấy thuộc tính

public static Object lấy thuộc tính(Object invokeObject, String fieldName) throws Exception
Phương thức getter của trường fieldName thuộc đối tượng invokeObject được gọi để truy xuất giá trị của nó.
Nếu không có phương thức getter, giá trị sẽ được lấy trực tiếp từ trường. Tuy nhiên, trong trường hợp này, thuộc tính mục tiêu phải có thuộc tính là public.

Thông số:
InvokeObject - Đối tượng cần được thực thi
Tên trường – Tên thuộc tính của đối tượng cần được thực thi
Giá trị trả về:
Giá trị trả về của phương thức getter
ngoại lệ:
Ngoại lệ – Lỗi sau đây xảy ra:
InvocationTargetException - Khi phương thức cơ bản ném ra một ngoại lệ
Ngoại lệ truy cập bất hợp pháp – Đối tượng Phương thức này là Java
Nếu cơ chế kiểm soát truy cập ngôn ngữ được triển khai và phương thức cơ bản không thể truy cập được.
NoSuchFieldException - Nếu không tìm thấy trường có tên được chỉ định

gọi

public static Object gọi(Object invokeObject, String callMethod, Object[] argObjects) throws InvocationTargetException, IllegalAccessException, NoSuchMethodException
Thao tác này thực thi phương thức "callMethod" của đối tượng "invokeObject".
Nếu có giá trị trả về, giá trị đó có thể được nhận dưới dạng một đối tượng.

Thông số:
InvokeObject - Đối tượng cần được thực thi
gọi phương thức – Tên của phương thức cần thực thi
argObjects – Nếu có tham số, hãy truyền chúng dưới dạng mảng các đối tượng. Nếu không có tham số, hãy truyền giá trị null.
Giá trị trả về:
Giá trị trả về của việc thực thi "callMethod"
ngoại lệ:
InvocationTargetException - Khi phương thức cơ bản ném ra một ngoại lệ
Ngoại lệ truy cập bất hợp pháp – Đối tượng Phương thức này là Java
Nếu cơ chế kiểm soát truy cập ngôn ngữ được triển khai và phương thức cơ bản không thể truy cập được.
NoSuchMethodException - Nếu không tìm thấy phương thức có tên được chỉ định

tìm phương thức

Phương thức tĩnh công khai tìm phương thức(Object invokeObject, String callMethod, Object[] argObjects) throws NoSuchMethodException
Thao tác này tìm kiếm phương thức "callMethod" của đối tượng "invokeObject".

Thông số:
InvokeObject - Đối tượng cần được thực thi
gọi phương thức – Tên phương thức của đối tượng cần được thực thi
argObjects – Nếu có tham số, hãy truyền chúng dưới dạng mảng các đối tượng. Nếu không có tham số, hãy truyền giá trị null.
Giá trị trả về:
Các đối tượng phương thức đáp ứng các điều kiện của các đối số được chỉ định.
ngoại lệ:
NoSuchMethodException - Nếu không tìm thấy phương pháp phù hợp, hoặc nếu tên là "" hoặc ""

đặt trường

public static void đặt trường(Object invokeObject, String fieldName, Object value) throws IllegalAccessException, NoSuchFieldException
Giá trị "value" được lưu trữ trong trường có tên "fieldName" của đối tượng "invokeObject" sẽ được thực thi.

Thông số:
InvokeObject - Đối tượng cần được thực thi
Tên trường – Tên trường của đối tượng cần được thực thi
Khuyến khích – Giá trị cần thiết lập
ngoại lệ:
Ngoại lệ truy cập bất hợp pháp – Đối tượng được chỉ định là trường cơ sở (hoặc lớp con hoặc lớp triển khai của nó).
Nếu nó không phải là một thể hiện của lớp hoặc giao diện khai báo nó, hoặc nếu quá trình chuyển đổi giải nén thất bại.
NoSuchFieldException - Nếu không tìm thấy trường có tên được chỉ định

getField

public static Object getField(Object invokeObject, String fieldName) throws IllegalAccessException, NoSuchFieldException
Thao tác này truy xuất giá trị của trường có tên "fieldName" của đối tượng "invokeObject" đang được thực thi.

Thông số:
InvokeObject - Đối tượng cần được thực thi
Tên trường – Tên trường của đối tượng cần được thực thi
Giá trị trả về:
Giá trị trả về
ngoại lệ:
Ngoại lệ truy cập bất hợp pháp – Đối tượng được chỉ định là trường cơ sở (hoặc lớp con hoặc lớp triển khai của nó).
Nếu nó không phải là một thể hiện của lớp hoặc giao diện khai báo nó, hoặc nếu quá trình chuyển đổi giải nén thất bại.
NoSuchFieldException - Nếu không tìm thấy trường có tên được chỉ định

có trường

public static boolean có trường(Object object, String fieldName) throws Exception
Điều này kiểm tra xem đối tượng "object" đã khai báo một trường có tên là "fieldName" hay chưa.

Thông số:
sự vật - Đối tượng cần kiểm tra
Tên trường – Tên của khu vực cần kiểm tra
Giá trị trả về:
Nếu được khai báo, thì đúng.
ngoại lệ:
Ngoại lệ

GETALLFields

public static java.util.TreeSet GETALLFields(Đối tượng object) ném ra ngoại lệ
Thông số:
sự vật
Giá trị trả về:
ngoại lệ:
Ngoại lệ

getShortClassName

public static String getShortClassName(Đối tượng đối tượng)
Thao tác này truy xuất tên lớp không đủ điều kiện từ một đối tượng.

Thông số:
sự vật
Giá trị trả về:

getShortClassName

public static String getShortClassName(String className)
Thao tác này trích xuất tên lớp từ tên đầy đủ.

Thông số:
tên lớp
Giá trị trả về:

GETFieldName

public static String GETFieldName(Tên phương thức chuỗi)
Hãy đổi tên trường từ tên phương thức. Việc này phải tuân theo quy ước của JavaBeans.

Thông số:
tên dữ liệu
Giá trị trả về:

isClassExist

public static boolean isClassExist(String className)
Thao tác này kiểm tra xem tên đầy đủ "className" có phải là tên lớp đã tồn tại hay không.

Thông số:
tên lớp
Giá trị trả về:

getPropertyDescriptors

public static PropertyDescriptor[] getPropertyDescriptors(Đối tượng object) ném ra IntrospectionException
Phương thức này trả về một PropertyDescriptor chứa thông tin đối tượng cho "object".

Thông số:
sự vật
Giá trị trả về:
ngoại lệ:
java.beans.IntrospectionException

Mã nguồn BeanUtil

  • URLをコピーしました!
mục lục