Reflection Intro | معرفی رفلکشن
توضیحات جلسه
جزوه و مستندات
مفاهیم کلیدی
- Reflection
توانایی یک برنامه برای بررسی و حتی تغییر ساختار و رفتار درونی خود، مانند Classها، Interfaceها، Fieldها و Methodها، در زمان اجرا (Runtime) است.
- Runtime vs Compile-time
رفلکشن کاملاً در زمان اجرا (Runtime) عمل میکند. در حالی که کدهای معمولی در زمان کامپایل بررسی میشوند، رفلکشن اجازه میدهد کارهایی انجام دهیم که در زمان کامپایل برای جاوا ناشناخته هستند.
- java.lang.reflect
نام پکیج استاندارد در جاوا است که تمام ابزارها و کلاسهای موردنیاز برای کار با رفلکشن را در اختیار برنامهنویس قرار میدهد.
- Inspection
فرآیند بررسی ویژگیهای یک کلاس در زمان اجرا است؛ مانند دریافت نام کلاس، لیست متدها، فیلدها، Constructorها و Annotationها.
- Modification
قابلیت تغییر مقادیر فیلدها در زمان اجرا. با استفاده از رفلکشن میتوان حتی مقادیر فیلدهای private را که در حالت عادی غیرقابلدسترسی هستند، تغییر داد.
- Performance Overhead
بار پردازشی اضافهای است که به دلیل ماهیت داینامیک رفلکشن ایجاد میشود. کدهای مبتنی بر رفلکشن، به دلیل بررسیهای زمان اجرا، نسبت به کدهای معمولی سرعت کمتری دارند.
- Encapsulation Violation
به معنای شکستن اصل کپسولهسازی در برنامهنویسی شیگرا است. از آنجا که رفلکشن اجازه دسترسی به اعضای private را میدهد، عملاً مرزهای دسترسی تعریفشده در کلاس را از بین میبرد.
موارد مصاحبه ای
- تفاوت اصلی کد معمولی و Reflection چیست؟
کد معمولی در زمان کامپایل بررسی و تثبیت میشود، اما رفلکشن به ما اجازه میدهد در زمان اجرا بهصورت کاملاً داینامیک (Dynamic) با تایپهایی کار کنیم که در زمان کامپایل از وجود آنها اطلاعی نداشتیم.
- چرا استفاده بیش از حد از Reflection توصیه نمیشود؟
به سه دلیل اصلی:
۱. کاهش شدید کارایی (Performance)
۲. از دست رفتن امنیت زمان کامپایل (Compile-time Safety) که منجر به خطاهای Runtime میشود
۳. افزایش پیچیدگی کد و دشوار شدن فرایند عیبیابی (Debugging)
- آیا میتوان با Reflection متدهای private را اجرا کرد؟
بله، رفلکشن این امکان را فراهم میکند که محدودیتهای دسترسی نادیده گرفته شوند و متدها یا فیلدهای private فراخوانی یا تغییر داده شوند.
- کاربرد Reflection در فریمورکهایی مانند Spring و Hibernate چیست؟
در Spring از رفلکشن برای پیادهسازی Dependency Injection استفاده میشود و در Hibernate برای نگاشت (Mapping) خودکار فیلدهای یک Object به ستونهای دیتابیس، بدون نیاز به دانستن نام آنها در زمان کامپایل، به کار میرود.
- خطاهای رایج هنگام کار با Reflection چیست؟
خطاهایی مانند NoSuchMethodException، زمانی که متد موردنظر پیدا نشود، یا IllegalAccessException، در صورت نداشتن دسترسی مجاز، که همگی در زمان اجرا (Runtime) رخ میدهند.
سناریو کاربردی
یکی از ملموسترین سناریوها، تبدیل دادههای JSON به اشیای جاوا در کتابخانههایی مانند Jackson است. زمانی که یک رشته JSON از سمت کلاینت ارسال میشود، کتابخانه سریالسازی (Serialization) نام فیلدها را در زمان اجرا از داخل کلاس استخراج کرده و مقادیر را بهصورت داینامیک در آنها قرار میدهد.
سناریوی دیگر مربوط به فریمورکهای تست (Testing Frameworks) است؛ جایی که برنامهنویس نیاز دارد یک متد private را برای اطمینان از صحت عملکرد آن تست کند. در این شرایط، رفلکشن تنها راه برای فراخوانی آن متد خارج از بدنه کلاس اصلی محسوب میشود.
بیشتر بدانید
- نکته پرفورمنس
همیشه در نظر داشته باشید که کدهای مبتنی بر رفلکشن بهمراتب کندتر از کدهای معمولی هستند. در سناریوهایی که پرفورمنس اهمیت حیاتی دارد، استفاده نادرست از رفلکشن میتواند زمان اجرای عملیات را از چند دقیقه به چندین ساعت افزایش دهد.
- تغییرناپذیری متدها
در رفلکشن میتوانید فیلدها را تغییر دهید یا متدها را فراخوانی کنید، اما امکان تغییر بدنه یا کد داخلی یک متد در زمان اجرا وجود ندارد.
- بررسی Annotationها
رفلکشن یکی از معدود ابزارهایی است که به برنامهنویس اجازه میدهد تشخیص دهد چه Annotationهایی روی یک کلاس یا متد قرار گرفتهاند و بر اساس آنها تصمیمات منطقی در برنامه اتخاذ کند.
