Phản ánh là một cấu trúc mạnh mẽ thường được sử dụng bởi các thư viện cơ bản như Guice và Hibernate để làm cho cuộc sống dễ dàng hơn. Nó thường được sử dụng khi một lớp cần được cấu hình và sau đó được khởi tạo ngay lập tức. Ví dụ:
public Strategy prepare(String clazz, Properties config) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
Class<?> clazz = Class.forName(clazz);
Strategy strategy = (Strategy) clazz.newInstance();
strategy.initialise(config);
return strategy;
}
Ở đây, thông số clazz đặt tên lớp là khởi tạo. Giả sử rằng lớp sẽ là một lớp con của lớp/giao diện Chiến lược. Sau đó nó cũng được khởi tạo với các thiết lập được truyền qua thông số cấu hình. Điều này cho phép một môi trường có khả năng cấu hình cao.
Tuy nhiên, phản ánh khá thường dẫn đến mã rất nguy hiểm (và độc hại) và vì lý do đó, nên tránh phản chiếu, trừ khi thật cần thiết. Cũng nên nhớ, phản xạ đó chậm hơn so với cuộc gọi trực tiếp. Đây là một ví dụ thực tế được lấy từ một hệ thống sản xuất về cách KHÔNG sử dụng sự phản chiếu.
private static CacheManager getRawInstance() {
lock.lock();
try {
final Field field = CacheManager.class.getDeclaredField("singleton");
field.setAccessible(true); // << -- ??
return (CacheManager) field.get(CacheManager.class);
} catch (Exception e) {
logger.error(e.getMessage(), e);
return null;
} finally {
lock.unlock();
}
}
Ở đây, trường riêng tư trong ehcache được thay đổi và truy cập. Đây là mã hóa hết sức xấu.
Nguồn
2013-01-16 07:01:08
Hoặc http://stackoverflow.com/questions/9222621/java-what-scenarios-call-for-the-use-of-reflection –