Danh mục

Động lực học lập trình Java, Phần 8: Thay thế sự phản chiếu bằng việc tạo mã

Số trang: 22      Loại file: pdf      Dung lượng: 549.81 KB      Lượt xem: 7      Lượt tải: 0    
Thư viện của tui

Xem trước 3 trang đầu tiên của tài liệu này:

Thông tin tài liệu:

Tạo mã thời gian chạy cung cấp một cách để thay thế sự phản chiếu bằng sự truy cập trực tiếp nhằm đạt hiệu năng tối đa Dennis Sosnoski, Nhà tư vấn, Sosnoski Software Solutions, Inc. Tóm tắt: Các phần trước trong loạt bài này, bạn đã tìm hiểu hiệu năng của sự phản chiếu chậm hơn nhiều lần so với truy cập trực tiếp như thế nào và sau đó đã học về hoạt động lớp (classworking) với Javassist và Apache Byte Code Engineering Library (BCEL-Thư viện kỹ thuật mã byte). Nhà tư vấn Java Dennis Sosnoski hoàn thành...
Nội dung trích xuất từ tài liệu:
Động lực học lập trình Java, Phần 8: Thay thế sự phản chiếu bằng việc tạo mã Động lực học lập trình Java, Phần 8: Thay thế sự phản chiếu bằng việc tạo mãTạo mã thời gian chạy cung cấp một cách để thay thế sự phản chiếu bằng sự truycập trực tiếp nhằm đạt hiệu năng tối đaDennis Sosnoski, Nhà tư vấn, Sosnoski Software Solutions, Inc.Tóm tắt: Các phần trước trong loạt bài này, bạn đã tìm hiểu hiệu năng của sựphản chiếu chậm hơn nhiều lần so với truy cập trực tiếp như thế nào và sau đó đãhọc về hoạt động lớp (classworking) với Javassist và Apache Byte CodeEngineering Library (BCEL-Thư viện kỹ thuật mã byte). Nhà tư vấn Java DennisSosnoski hoàn thành loạt bài Động lực học lập trình Java của mình bằng cách giảithích cách bạn có thể sử dụng hoạt động lớp trong thời gian chạy để thay thế mãphản chiếu bằng mã được tạo ra để lao hết tốc độ về phía trước.Bây giờ bạn đã thấy cách sử dụng các khung công tác Javassist và BCEL cho hoạtđộng lớp (xem liệt kê các bài viết trước trong loạt bài này), tôi sẽ cho bạn thấy mộtứng dụng hoạt động lớp thực tế. Ứng dụng này đang thay thế việc sử dụng sự phảnchiếu bằng các lớp được tạo trong thời gian chạy và được nạp trực tiếp vào JVM.Trong quá trình ráp nó lại với nhau, tôi sắp quay lại hai bài báo đầu tiên của loạtbài này cũng như trình bày Javassist và BCEL, vì thế nó tạo ra một sự kết thúc tốtđẹp cho những gì tạo thành một loạt các bài viết dài.Các mã phản chiếu theo hiệu năngQuay lại Phần 2, tôi đã cho thấy cách mã phản chiếu chậm hơn nhiều lần so vớimã trực tiếp cho cả truy cập trường và cả các cuộc gọi phương thức. Sự chậm chạpnày không phải là một vấn đề cho nhiều ứng dụng, nhưng luôn có các trường hợpở đó hiệu năng rất quan trọng. Trong những trường hợp này, mã phản chiếu có thểbiểu diễn một nút cổ chai thực. Mặc dù việc thay thế mã phản chiếu bằng mã đượcbiên dịch tĩnh có thể rất lộn xộn và trong một số trường hợp (như trong các khungcông tác ở đó các lớp hoặc các mục được mã phản chiếu truy cập được cung cấptrong thời gian chạy, chứ không phải là một phần của cùng một quá trình xâydựng) thậm chí không thể thực hiện được nếu không cấu trúc lại toàn bộ ứng dụng.Hoạt động lớp cung cấp cho bạn một sự thay thế kết hợp hiệu năng của mã đượcbiên dịch tĩnh với tính linh hoạt của mã phản chiếu. Cách tiếp cận cơ bản ở đây làđể xây dựng một lớp tùy chỉnh trong thời gian chạy để bao bọc việc truy cập tớicác lớp đích (trước đó đã đạt được bằng mã phản chiếu ) theo một cách mà mãmục đích chung của bạn có thể sử dụng. Sau khi nạp các lớp tuỳ chỉnh vào JVM,rồi bạn thiết lập để chạy hết tốc độ.Thiết lập tầngLiệt kê 1 đưa ra một điểm khởi đầu cho ứng dụng. Ở đây tôi đã xác định một lớpbean đơn giản, HolderBean và một lớp truy cập, ReflectAccess. Lớp truy cập cómột đối số dòng lệnh. Đối số này phải có tên của một trong các thuộc tính của lớpbean có giá trị int (value1 hoặc value2). Nó tăng giá trị của thuộc tính có tên, rồi inra cả hai giá trị thuộc tính trước khi thoát ra.Liệt kê 1.Phản chiếu một beanpublic class HolderBean{ private int m_value1; private int m_value2; public int getValue1() { return m_value1; } public void setValue1(int value) { m_value1 = value; } public int getValue2() { return m_value2; } public void setValue2(int value) { m_value2 = value; }}public class ReflectAccess{ public void run(String[] args) throws Exception { if (args.length == 1 && args[0].length() > 0) { // create property name char lead = args[0].charAt(0); String pname = Character.toUpperCase(lead) + args[0].substring(1); // look up the get and set methods Method gmeth = HolderBean.class.getDeclaredMethod (get + pname, new Class[0]); Method smeth = HolderBean.class.getDeclaredMethod (set + pname, new Class[] { int.class }); // increment value using reflection HolderBean bean = new HolderBean(); Object start = gmeth.invoke(bean, null); int incr = ((Integer)start).intValue() + 1; smeth.invoke(bean, new Object[] {new Integer(incr)}); // print the ending values System.out.println(Result values + bean.getValue1() + , + bean.getValue2()); } else { System.out.println(Usage: ReflectAccess value1|value2); } }}Dưới đây là một cặp ví dụ chạy ReflectAccess để minh họa cho các kết quả:[dennis]$ java -cp . ReflectAccess value1Result values 1, 0[dennis]$ java -cp . ReflectAccess value2Result values 0, 1Đừng bỏ lỡ phần còn lại của loạt bài nàyPhần 1, Các lớp Java và nạp lớp (04.2003)Phần 2, Giới thiệu sự phản chiếu (06.2003)Phần 3, Ứng dụng sự phản chiếu (07.2003)Phần 4, Chuyển đổi lớp bằng Javassist (09.2 ...

Tài liệu được xem nhiều: