Tôi hoàn toàn không chắc mình hiểu câu hỏi nhưng các lớp Java đã bao gồm mọi thứ cần phải thực hiện sự phản chiếu trên chúng. Tệp .class không thay đổi dựa trên cách nó được sử dụng.
Chỉnh sửa 1: Cung cấp một số ví dụ cụ thể hơn để phân biệt tốt hơn loại "phản chiếu" mà chúng ta đang nói đến.
Ví dụ:
class Foo {
public void bar() {
System.out.println("Hello, world.");
}
}
// Conventional calling
Foo f = new Foo();
foo.bar();
// Reflection based callling
Class fooClass = Class.forName("Foo");
Method m = fooClass.getMethod("bar", null);
Object f = fooClass.newInstance();
m.invoke(m, null);
Trong trường hợp gọi điện thoại thông thường, Foo.class và bất kỳ phụ thuộc lớp trực tiếp của nó sẽ được nạp. thanh sẽ được thực hiện. Các chuỗi "Foo" và "bar" sẽ đã được thực thi như một phần của lớp gọi bởi vì mã byte sử dụng các chuỗi để giải quyết các lớp và các phương thức trong thời gian chạy. (thực sự "bar" sẽ là chữ ký đầy đủ của phương thức, vì vậy thực sự dài hơn "thanh")
Trong trường hợp phản chiếu, chính xác điều tương tự cũng xảy ra. Lớp bổ sung duy nhất được nạp là Method.class. Đó sẽ là ảnh hưởng duy nhất đến kích thước perm.
Trường hợp thứ hai có ý nghĩa về hiệu suất. Phương pháp tra cứu tương đối đắt tiền nên bạn nên sử dụng các đối tượng Phương thức cache khi có thể. Cuộc gọi phương thức bổ sung để gọi có một hàm ý hiệu suất nhỏ vì đó là một cuộc gọi phương thức bổ sung. Điểm phát sóng sẽ gặp sự cố khi tối ưu hóa thông qua cuộc gọi này ... ít nhất là hơn bình thường. JITing xảy ra chính xác như nhau.
Chỉnh sửa 2: Ghi nhận một số đối tượng bổ sung được nạp trong quá trình phản ánh ...
java.lang.Class sẽ tạo ra và đối tượng Method cache (hoặc đối tượng Field, vv) khi truy cập. Đây là những bộ nhớ đệm trong một SoftReference và do đó sẽ được khai hoang nếu sử dụng bộ nhớ đòi hỏi nó.
Tuy nhiên, việc khởi tạo các đối tượng này có nghĩa là có thể có thêm chuỗi được quốc tế tải bởi máy ảo để hỗ trợ tạo các đối tượng Phương thức này. Tôi đoán là những sợi dây này có thể đã là một phần của hồ bơi không đổi của lớp phản xạ nhưng có thể chúng không phải vậy. Dù bằng cách nào, đó là một lần nhấn duy nhất cho mỗi phương thức mỗi lớp, mỗi trường cho mỗi lớp, vv .. Truy cập các phương thức, bạn sẽ nhận được ít nhất tất cả các tên cho các phương thức đó được thực hiện. Truy cập vào các lĩnh vực, bạn sẽ nhận được tên của những lĩnh vực intern'ed.
Điều tôi tin rằng bạn đang thấy ở đó đang thực hiện tìm kiếm tên để '==' có thể được sử dụng trên các tên phương thức đã được tập trung. (Không thuyết phục đó là một ý tưởng tuyệt vời.) Trong khuôn mặt, sự phản chiếu có thể tạo ra các lớp (đôi khi). –
(Những chuỗi nội bộ có thể được GCable với chu trình thu gom rác đầy đủ, giả sử chất lượng thực hiện tốt.) –
@Tom, bạn có thể cung cấp một ví dụ duy nhất trong đó lớp được tạo do phản ánh không? Tôi không cố gắng là một nỗi đau, tôi thực sự muốn biết về những trường hợp này như tôi chưa từng thấy. – PSpeed