Java reflection là gì

      9

1. Msống đầu :Lúc Này nhỏng bản thân thấy thì tất cả khôn cùng không nhiều sách cũng như ebook đề cùa đến chuyên môn reflection vào programming, với cũng rất không nhiều bạn biết về có mang này, trong những khi hầu như những framework Khủng các thực hiện. Không biết đến chuyên môn này thì trái là một thiệt thòi không thể nhỏ

*
. Hôm ni mình vẫn share một không nhiều kiến thức về reflection vào programming, hy vọng hữu dụng mang lại chúng ta. ( chú ý cùng với các ngữ điệu script, context hoàn toàn có thể không giống đi ).

Bạn đang xem: Java reflection là gì

2. Khái niệmĐã bao giờ bạn từ bỏ thắc mắc làm sao những framework MVC rất có thể mapping url request vào chính xác từng controller, xuất xắc làm thế nào spring lại rất có thể khởi chế tác bean tự xml configuration or annotation, injection những cực hiếm vào bean? Tất cả là dựa vào mang lại nghệ thuật reflection.Vậy reflection là gì?

Reflection là một trong phép tắc được cho phép bạn có thể quan giáp (observing) với chuyển đổi lịch trình lúc runtime (wiki) . Hiểu nôm mãng cầu tức là reflection cho phép chúng ta gán/modify mã code trong thời hạn chạy, tốt có thể nói, nó chất nhận được bọn họ thao tác làm việc với “meta data” của một object.

Dựa vào reflection, chúng ta cũng có thể kiểm tra coi một class A đã có quan niệm chưa, Một method B thì có những annotation như thế nào, điện thoại tư vấn method của một object chưa chắc chắn thương hiệu cơ hội runtime cơ mà không cần biết tên method kia lúc compile…

3. ExampleĐể làm rõ hơn về reflection thì họ sẽ demo làm cho một ví dụ về reflection. À bỏ quên ngôn ngữ là java nhé các bạn

*
( .NET cũng tương tự như thế nhé)

Bài toán : Giả sử bạn có một lịch trình nhằm thực hiện update dữ liệu vào DataBase. Vì từng CSDL khác nhau bắt buộc chúng bao gồm nguyên tắc thao tác làm việc khác nhau. Giả sử họ tất cả class MysqlJdbcDriver để thao tác cùng với cơ sở dữ liệu Mysql, MssqlJdbcDriver nhằm thao tác làm việc với DataBase MsSql. 2 class này rất nhiều implement interface JdbcDriver, có một method là executeSql. Tùy vào config, chương trình vẫn tự động instance driver tương xứng để liên kết DataBase.

Xem thêm: Hướng Dẫn Bật Chế Độ Dark Mode Facebook Nền Đen

Interface JdbcDriver

public interface JdbcDriver void executeSql(String sql);Class MysqlJdbcDriver

public class MysqlJdbcDriver implements JdbcDriver public void executeSql(String sql) System.out.println("Run on Mysql"); System.out.println("Execute sql : " + sql); Class MssqlJdbcDriver

public class MssqlJdbcDriver implements JdbcDriver public void executeSql(String sql) System.out.println("Run on Mssql"); System.out.println("Exexinh đẹp sql : " + sql); Class Program

public class Program /** Chụ ý : chuỗi chứa class driver trong ví dụ này bản thân đã để hard code. Thực tế thì nó rất có thể được load từ xml configuration, Annotation value,environment variable database or anywhere */ private String driverConfig = "MssqlJdbcDriver"; JdbcDriver jdbc; public Program() throws Exception Class driverClass = Class.forName(driverConfig); // create object by name this.jdbc = (JdbcDriver) driverClass.getConstructor().newInstance(); public void doUpdateData() this.jdbc.executeSql("update a mix b = "c""); public static void main(String<> args) throws Exception Program p = new Program(); p.doUpdateData(); Chạy lịch trình lên các bạn sẽ thấy công dụng

*

Run on MysqlExexinh tươi sql : update a set b = ‘c’

Thay đổi giá trị của driverConfig thành MssqlJdbcDriver, kết quả

Run on MssqlExexinh đẹp sql : update a phối b = ‘c’

Quý Khách thấy đấy, nếu như có chuyển đổi cơ sở dữ liệu, thì class Program cũng chưa hẳn biến hóa gì. Chúng ta vẫn injection quý giá cho variable jdbc

*

Extra : Trong MVC, thì các url thường xuyên được mapping cùng với những controller rõ ràng. Các chúng ta cũng có thể dùng reflection để gửi request cho đúng Controller. Kiến trúc cũng rất đơn giản dễ dàng :

quý khách hàng có 1 Servlet đang handle toàn cục request : url-pattern = * (website.xml)Trong Servlet này, phụ thuộc url request, chúng ta có thể xác định được url request tương xứng cùng với class controller nào? tương xứng cùng với method làm sao vào controller đó. trả sử request là /abc/def thì class controller đã là acb, method là def ( or bạn có thể tự đặt ra rule đến riêng mình
*
)Khởi tạo thành đối tượng người sử dụng controller cùng call method tương xứng bằng reflection.Nhận hiệu quả trả về từ step 3, response về cho người cần sử dụng.

4. Tóm lại :Để nắm rõ hơn nữa thì các bạn phải thực hành nhiều hơn thế với gặp gỡ hồ hết bài xích tân oán rõ ràng. Vì phần này nhiều phần nằm tại vị trí những framework đề nghị cũng không nhiều va chạm. Hy vọng topic có ích đến chúng ta. Mình chỉ share phần đông kỹ năng và kiến thức bản thân biết. Nếu bao gồm gì sai mong chúng ta góp ý. Thank all.

Xem thêm: Chụp Lén Ảnh Chụp Lén Cặp Sinh Viên Làm Tình, Ảnh Chụp Lén Tự Sướng Của Cô Nàng 9X


một kỹ năng quan trọng và lưu niệm, tuy vậy đa số nhằm phát âm đọc code, từ có tác dụng cũng mệt nhọc, đồ vật gi bám chữ meta vào là thấy ngán

*


bản thân tất cả liếc qua mấy bài bên trên mạng nói về reflection nó nói là : Reflection là kinh nghiệm khôn xiết cần thiết để lấy các báo cáo của một kiểu dữ liệu. Dựa vào kia ta rất có thể kích hoạt (nlỗi các phương thức) hoặc chế tạo biểu đạt của hình trạng dữ liệu đóVậy là nó nhờ vào method forName() để đưa ban bố của một class làm sao kia trải qua thương hiệu class kia cần không

như vào dòng vd này:trường hợp đang biết được tên chính xác của đối tượng người tiêu dùng này rồi sao còn đề nghị sử dụng cái Field kia nhằm mix quý giá mang đến field nữa sao không dùng foo.set() mang đến nkhô giòn ???

public class Foo public int myField=0; public static void main(String args<>) try Foo foo=new Foo(); System.out.println("Default value: "+foo.myField); Class c = Class.forName("Foo"); Field f=c.getField("myField"); f.set(foo, 100); System.out.println("After changing: " +foo.myField); catch (Throwable e) e.printStackTrace();
Đối cùng với đoạn code bên trên, sửa nuốm này thì nó tất cả ý nghĩa sâu sắc này:

import java.reflect.Method;public class Foo public static int myField=0; public static void Say() System.out.println("Say foo with myField: " + myField); public static void main(String args<>) try Class c = Class.forName("Foo"); // Tgiỏi doi gia tri bien static Field f=c.getField("myField"); f.set(c.newInstance(), 100); // c.newInstance() se tra ve sầu mot Object dai dien đến class Foo // Goi phuong thuc static Method func = c.getMethod("Say",null); func.invoke(null); catch (Exception e) e.printStackTrace(); vì vậy vào code hàm main ko nên biết đến sự hiện diện của class Foo nhưng mà vẫn có thể thao tác làm việc các yếu tắc của nó, vận dụng được với cả thành phần chưa hẳn là static hoặc bao gồm đối số truyền vào


Đây là một ví dụ không thực sự làm cho câu hỏi sử dụng reflection có ý nghĩa sâu sắc.quý khách hàng hãy tưởng tượng 1 bài xích toán nlỗi sau :Trong mô hình web MVC, hay thì lúc request lên 1 url, request này sẽ được forward (đúng là forward) tới 1 controller rõ ràng. Thường quy tắc sẽ nhỏng sau, VD/Product/Edit/1=> Lúc kia Product tức thị Product controller, Edit là action và một là parameter.lúc request tới URL này, thì rõ ràng là method edit của class ProductController được Gọi.Vậy thắc mắc là làm thế nào các engine của những web MVC rất có thể Điện thoại tư vấn được method này dựa vào url??? Quý Khách không thể biết trước người tiêu dùng request tới url nào để khởi tạo những controller này cả. (Cũng thiết yếu cần sử dụng switch case để triển khai vì làm thế nào mà hiểu rằng bạn ta đang define hầu hết controller nào? )Câu trả lời là chúng ta cần sử dụng reflection. trước hết các engine vẫn parse url để xem url kia request đến/ mapping đến controller làm sao (sang một số tập quy chế độ nhỏng RouterConfig của ASP..NET or antonation của JAVA).Nlỗi ví dụ làm việc bên trên thì mình đang đem được TÊN của controller là “Product”. Từ thương hiệu controller này, sử dụng refecltion thì hoàn toàn có thể khởi tạo được class ProductController, giống như điều đó để call method Edit.Trước lúc parse url, phiên bản thân engine hoàn toàn chần chừ controller được request tới là j cả, yêu cầu chẳng thể if else, switch case được…Đây chỉ là 1 trong ví dụ vô cùng đơn giản dễ dàng ( thực tiễn nó tinh vi rộng nhiều ). Hoặc chúng ta có thể tham khảo những library ORM (database), nó cũng áp dụng reflection nhằm mapping column, table với những properties, class.Nói Kết luận, trước mắt các bạn cđọng đọc reflection là làm việc cùng với META Data của một object. Dữ liệu để trình bày 1 tài liệu không giống thì tín đồ ta Hotline là meta data.


Chuyên mục: Tin Tức