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میشود، و ۳. افزایش پیچیدگی کد و دشوار شدن فرآیند دیباگ. -
آیا میتوان با Reflection متدهای private را اجرا کرد؟ بله، رفلکشن این قدرت را فراهم میکند که محدودیتهای دسترسی را نادیده گرفته و متدها یا فیلدهای
privateرا فراخوانی یا اصلاح کنیم. -
کاربرد Reflection در فریمورکهای بزرگی مثل Spring و Hibernate چیست؟ در
Springبرای پیادهسازیDependency Injectionو درHibernateبرای مپ کردن خودکار فیلدهای یکObjectبه ستونهای دیتابیس (بدون اینکه از قبل نام آنها را بدانند) استفاده میشود. -
خطاهای رایج هنگام کار با رفلکشن چیست؟ خطاهایی مانند
NoSuchMethodException(زمانی که متد مورد نظر یافت نشود) یاIllegalAccessException(در صورت عدم دسترسی مجاز) که همگی در زمان اجرا رخ میدهند.
سناریو کاربردی
یکی از ملموسترین سناریوها، تبدیل دادههای JSON به اشیای جاوا در کتابخانههایی مثل Jackson است. وقتی یک رشته JSON از سمت کلاینت میرسد، کتابخانه سریالیزیشن نام فیلدها را در زمان اجرا از داخل کلاس شما استخراج کرده و مقادیر را به صورت داینامیک در آنها قرار میدهد.
سناریوی دیگر در فریمورکهای تست (Testing Frameworks) است؛ جایی که برنامهنویس نیاز دارد یک متد private را برای اطمینان از صحت عملکرد تست کند. در این حالت رفلکشن تنها راه برای فراخوانی آن متد خارج از بدنه کلاس اصلی است.
بیشتر بدانید
-
نکته پرفورمنس همیشه به خاطر داشته باشید که کدهای رفلکشن به شدت کندتر هستند. در سناریوهایی که پرفورمنس حیاتی است، استفاده از آن میتواند زمان اجرای یک عملیات را از چند دقیقه به چندین ساعت افزایش دهد.
-
تغییرناپذیری متدها در رفلکشن شما میتوانید فیلدها را تغییر دهید یا متدها را صدا بزنید، اما نمیتوانید بدنه (کد داخلی) یک متد را در زمان اجرا عوض کنید.
-
بررسی Annotationها رفلکشن یکی از معدود راههایی است که برنامهنویس میتواند از طریق آن بفهمد چه
Annotationهایی روی یک کلاس یا متد قرار داده شده و بر اساس آنها تصمیمات منطقی در برنامه بگیرد.
