2012-01-24 15 views
6

Trong khi nghiên cứu các hướng dẫn Java, Reflection và Late Binding đã làm tôi bối rối. Trong một số hướng dẫn, họ đã viết rằng cả hai đều giống nhau và không có sự khác biệt nào giữa Reflection và Late Binding. Nhưng các hướng dẫn khác nói rằng có sự khác biệt.Sự khác biệt giữa Reflection và Late Binding trong java với các ví dụ thời gian thực

Tôi bối rối, vì vậy ai đó có thể vui lòng giải thích những gì Reflection và Late Binding là trong Java, và nếu posible, xin vui lòng cho tôi một số ví dụ thế giới thực của cả hai.

Cảm ơn ..

Trả lời

2

Late binding (còn gọi là cử động) không cần suy nghĩ - nó vẫn cần phải biết thành viên để tự động liên kết với tại thời gian biên dịch (tức là chữ ký của thành viên được biết tại thời gian biên dịch), mặc dù ràng buộc với các thành viên bị ghi đè xảy ra vào thời gian chạy.

Khi làm phản chiếu, bạn thậm chí không biết thành viên mà bạn đang sử dụng (không phải ngay cả những tên được biết đến tại thời gian biên dịch, chứ chưa nói đến chữ ký) - mọi thứ xảy ra tại run- thời gian, vì vậy nó chậm hơn rất nhiều.

+0

Không chắc hiệu suất thực sự là không gian tốt nhất để đưa vào tài khoản khi so sánh các tính năng khác nhau như của một ngôn ngữ, họ nhằm mục đích giải quyết vấn đề khác nhau ... –

3

Java sử dụng cuối ràng buộc để hỗ trợ đa hình; có nghĩa là quyết định sử dụng nhiều phương pháp được hoãn lại cho đến khi chạy.

Lấy trường hợp của lớp N triển khai phương pháp trừu tượng của giao diện (hoặc lớp trừu tượng, fwiw).

public interface IMyInterface { 

    public void doSomething();  
} 

public class MyClassA implements IMyInterface { 

    public void doSomething(){ ... } 
} 

public class MyClassB implements IMyInterface { 

    public void doSomething(){ ... } 
} 

public class Caller { 

    public void doCall(IMyInterface i){ 
     // which implementation of doSomething is called? 
     // it depends on the type of i: this is late binding 
     i.doSomething(); 
    } 
} 

Phản ánh được sử dụng để mô tả mã có thể kiểm tra mã khác, ví dụ: để biết phương thức hoặc thuộc tính nào có sẵn trong một lớp, để gọi một phương thức (hoặc nạp một lớp) theo tên và làm rất nhiều điều rất thú vị khi chạy.

Một Giải thích rất tốt đẹp của sự phản ánh là ở đây: What is reflection and why is it useful?

2

ví dụ Bất động thế giới:

Nếu bạn xây dựng dự án của bạn với jdesktop 0.8, nhưng tàu với jdesktop 0.9, mã của bạn vẫn sẽ sử dụng 0,9 tính năng, vì nó tận dụng lợi thế của việc ràng buộc trễ, tức là mã mà các cuộc gọi mã của bạn là phiên bản được nạp bởi trình nạp lớp, không phân biệt phiên bản mà nó được biên dịch chống lại. (Điều này trái ngược với các liên kết, nhúng phiên bản biên dịch của mã được gọi vào ứng dụng.)

Để phản ánh, giả sử bạn đang cố gắng nhắm mục tiêu Java 1.5 và 1.6, nhưng muốn sử dụng các thành phần tab trong 1.6 nếu chúng có sẵn, bạn sẽ kiểm tra sự hiện diện của chúng bằng cách sử dụng sự phản chiếu trên lớp JTabbedPane để tìm phương thức setTabComponentAt. Trong trường hợp này, bạn đang xây dựng dựa trên Java 1.5, không có các tính năng đó, vì vậy bạn không thể gọi chúng trực tiếp hoặc biên dịch sẽ thất bại. Tuy nhiên nếu trên hệ thống của người dùng cuối bạn thấy mình đang chạy với 1.6 (ràng buộc trễ đi vào chơi ở đây), bạn có thể sử dụng sự phản chiếu để gọi các phương thức không tồn tại trong 1.5.

Chúng có liên quan; nhiều cách sử dụng sự phản chiếu dựa vào sự ràng buộc muộn để có ích, nhưng về cơ bản chúng là những khía cạnh khác nhau của ngôn ngữ và việc thực hiện ngôn ngữ của nó.

1

Một vấn đề quan trọng được giải quyết bằng "Ràng buộc muộn" là tính đa hình, tức là cuộc gọi của phương pháp overriden đúng dọc theo lớp học của bạn được xác định trong thời gian chạy, không phải trong quá trình biên dịch.Reflection là tính năng thu thập và thao tác thông tin về các đối tượng của bạn trong thời gian chạy. Ví dụ. bạn có thể lấy tất cả các thuộc tính hoặc tên phương thức của một đối tượng bằng cách sử dụng thuộc tính 'Lớp' của nó trong thời gian chạy và gọi những phương thức đó hoặc thao tác các thuộc tính của nó. Trong mã sau, bạn có thể tự động tạo đối tượng mới bằng phương tiện phản chiếu (xem cách hàm tạo được truy xuất và truy cập bằng Lớp, thay vì chỉ sử dụng một đối tượng như obj = new MyClass ("MyInstance")). Theo cách tương tự, có thể truy cập các biểu mẫu, phương thức và thuộc tính khác của hàm tạo. Để biết thêm thông tin về phản ánh trong chuyến thăm java: http://java.sun.com/developer/technicalArticles/ALT/Reflection/

 

... in some method of some class ... 
Class c = getClass(); 
Constructor ctor = c.getConstructor(String.class); 
Object obj = ctor.newInstance("MyInstance"); 
 
0

tôi phải đồng ý với hầu hết các câu trả lời ở đây -

Mọi người gọi gì Java nào về zeroing trong trên một phương pháp thực hiện trong thời gian chạy như cuối ràng buộc, nhưng theo ý kiến ​​của tôi không chính xác của nó để sử dụng hạn cuối ràng buộc cho những gì java nào.

Ràng buộc trễ ngụ ý hoàn toàn không có kiểm tra về cuộc gọi phương thức tại thời gian biên dịch và không có lỗi biên dịch nếu phương thức không tồn tại.

Tuy nhiên, Java sẽ ném lỗi biên dịch nếu phương thức không tồn tại ở đâu đó trong phân cấp loại của loại đủ điều kiện gọi phương thức (hơi gần đúng khi mô tả hành vi ở đây). Đây không phải là sự ràng buộc muộn truyền thống thuần túy. Những gì Java thực hiện trong một cuộc gọi phương thức không tĩnh không chính thức không phải là cuối cùng sẽ được gọi tốt hơn là công văn động.
Tuy nhiên, nếu chúng ta sử dụng sự phản chiếu trong Java, thì Java thực hiện ràng buộc trễ tinh khiết vì trình biên dịch chỉ đơn giản là không thể xác minh nếu phương thức được gọi tồn tại hay không. Dưới đây là một ví dụ:

class A 
{ 
    public void foo() 
    { 
     System.out.println("Foo from A"); 
    } 
} 

class B extends A 
{ 
    public void foo() 
    { 
     System.out.println("Foo from B"); 
    } 
} 
public class C 
{ 
    public static void main(String [] args) 
    { 
     A a=new A(); 
     B b=new B(); 
     A ref=null; 
     Class ref1 = null; 
     ref1 = b.getClass(); 
     ref.foo1();//will not compile because Java in this normal method 
     //call does some compile time checks for method and method 
     //signature existence. NOT late binding in its pure form. 
     try { 
      ref1.getMethod("foo1").invoke(null); //will throw a 
      //NoSuchMethodException at runtime, but compiles perfectly even 
      //though foo1 does not exist. This is pure late binding. 
     } catch (Exception e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     } 
} 
Các vấn đề liên quan