Reflection معمولاً توسط برنامههایی استفاده میشود که به قابلیت بررسی یا تغییر رفتار runtime برنامههای در حال اجرای ماشین مجازی جاوا نیاز دارند. این قابلیت نسبتاً پیشرفته است و بهتر است فقط توسط توسعهدهندگانی استفاده شود که درک عمیقی از مبانی زبان جاوا دارند. با وجود این نکته، Reflection یک تکنیک قدرتمند است و میتواند برنامهها را قادر به انجام عملیاتی کند که در غیر این صورت امکانپذیر نیستند.
یک برنامه میتواند با استفاده از کلاسهای خارجی و سفارشیشده توسط کاربر، با ایجاد نمونههایی از اشیای گسترشپذیر از طریق نام کامل (Fully-Qualified Name) آنها، از امکانات Extension بهرهمند شود.
یک مرورگر کلاس باید بتواند اعضای کلاسها را فهرست کند. محیطهای توسعه بصری نیز میتوانند از اطلاعات Type موجود در Reflection برای کمک به توسعهدهنده در نوشتن کد صحیح بهرهمند شوند.
ابزارهای دیباگ باید بتوانند اعضای خصوصی (Private Members) کلاسها را بررسی کنند. ابزارهای تست نیز میتوانند از Reflection استفاده کنند تا بهصورت سیستماتیک مجموعهای از APIهای قابل کشف تعریفشده روی یک کلاس را فراخوانی کنند و از پوشش بالای کد در مجموعه تستها اطمینان حاصل کنند.
Reflection قدرتمند است، اما نباید بدون ملاحظه استفاده شود. اگر امکان انجام یک عملیات بدون استفاده از Reflection وجود دارد، بهتر است از آن اجتناب شود. هنگام دسترسی به کد از طریق Reflection، موارد زیر را در نظر داشته باشید:
از آنجا که Reflection با Typeهایی سر و کار دارد که بهصورت پویا (Dynamically) حل میشوند، برخی بهینهسازیهای JVM امکان اجرا ندارند. در نتیجه، عملیات Reflective عملکرد کندتری نسبت به معادلهای غیرReflective خود دارند و باید در بخشهایی از کد که در برنامههای حساس به عملکرد بهکرات فراخوانی میشوند، اجتناب شود.
Reflection میتواند در runtime کنترل شود و ماژولها میتوانند دسترسی Reflective به بخشهای داخلی خود را ممنوع کنند. این یک نکته مهم در طراحی برنامههایی است که از Reflection استفاده میکنند.
> همچنین لازم است بدانید که Reflection قابلیت بازبینی (Introspect) کلاسهای API استاندارد جاوا را از دست داده است. برای اطلاعات بیشتر میتوانید صفحه Reflective Access with Open Modules and Open Packages را مطالعه کنید.از آنجا که Reflection به کد اجازه میدهد عملیاتی را اجرا کند که در کد غیرReflective غیرقانونی هستند — مانند دسترسی به فیلدها و متدهای خصوصی (Private) — استفاده از Reflection میتواند منجر به عوارض جانبی غیرمنتظره شود. این عوارض ممکن است کد را ناکارآمد کرده و قابلیت حمل (Portability) آن را از بین ببرند. کد Reflective انتزاعات (Abstractions) را میشکند و بنابراین ممکن است با ارتقای پلتفرم رفتار آن تغییر کند.
این محتوا کاملا رایگان توسط تیم کدلپر ترجمه شده و در اختیار شما کاربران عزیز قرار گرفته است، هر گونه کپی برداری برای مقاصد غیر رایگان و بدون ذکر منبع، مورد پیگیری قانونی قرار میگیرد.
ترجمه شده از منبع: https://dev.java/learn/