Farzad Afi Logo

FarzadAfi

آموزش تخصصی برنامه نویسی

Aceess Class Info with Reflection in Java

📖توضیحات درس

🎥 این ویدیو قسمت شصت‌ و نهم از بوت‌کمپ رایگان جاواست. 📚 Reflection – معرفی آبجکت Class در جاوا تو این جلسه می‌ریم سراغ یکی از مهم‌ترین مباحث رفلکشن در جاوا؛ یعنی آبجکت Class. این آبجکت به ما اجازه می‌ده که ساختار یک کلاس رو در زمان اجرا بررسی کنیم، از اطلاعات پایه‌ای بگیریم تا تحلیل سازنده‌ها، فیلدها و متدها. توی این ویدیو با هم یاد می‌گیریم: 🔍 آبجکت Class چیست و چه نقشی در Reflection دارد؟ 🧩 چطور می‌تونیم اطلاعات اولیه‌ی یک کلاس رو دریافت کنیم 🪜 تشخیص super class و اینترفیس‌هایی که یک کلاس پیاده‌سازی کرده 🛠 بررسی و استخراج سازنده‌های یک کلاس 📦 بررسی فیلدهای یک کلاس ⚙️ تحلیل متدهای مختلف یک کلاس ✨ در انتهای ویدیو هم یک مرور سریع داریم تا نکات کلیدی بهتر تثبیت بشه 💬 گروه پرسش و پاسخ تلگرام: @programmingByFarzadAfi 💬 گروه پرسش و پاسخ بله: @programming_by_farzadafi هر سوالی داشتی بپرسی؛ من یا مربی‌های گروه در اولین فرصت کمکت می‌کنیم 🙌 🎯 بوت‌کمپ رایگان جاوا – یادگیری پروژه‌محور برای ورود حرفه‌ای به بازار کار
00:27:09🎯رایگان

📄جزوه

مفاهیم کلیدی

  • Reflection قابلیتی در زبان جاوا که به برنامه‌نویس اجازه می‌دهد در زمان اجرا (Runtime)، ساختار کلاس‌ها، متدها، فیلدها و سایر اجزای کد را بررسی کرده یا آن‌ها را تغییر دهد.

  • Class Object یک شیء مخصوص در حافظه که برای هر کلاس تعریف شده در جاوا ایجاد می‌شود. این شیء مانند یک «کارت شناسایی» عمل کرده و تمام اطلاعات مربوط به ساختار آن کلاس (Metadata) را در خود ذخیره می‌کند.

  • Metadata اطلاعاتی که درباره خودِ کلاس وجود دارد؛ مانند نام کلاس، نام پکیج، لیست متدها، فیلدها، سازنده‌ها (Constructors) و سطوح دسترسی (Modifiers).

  • Checked Exception استثناهایی که در زمان کامپایل بررسی می‌شوند و برنامه‌نویس مجبور است آن‌ها را مدیریت کند (مانند ClassNotFoundException هنگام استفاده از نام کلاس به صورت رشته).

  • Modifier کلمات کلیدی مانند public ،private ،final یا abstract که ویژگی‌ها و سطوح دسترسی یک کلاس یا اعضای آن را تعیین می‌کنند. در رفلکشن، این مقادیر معمولاً به صورت اعداد صحیح (Integer) برگردانده می‌شوند.

موارد مصاحبه ای

  • سه راه اصلی برای به دست آوردن Class Object چیست؟ ۱. استفاده از متد getClass() روی یک آبجکت موجود. ۲. استفاده از پسوند .class بعد از نام کلاس (مثلاً Person.class). ۳. استفاده از متد استاتیک Class.forName() با دادن نام کامل کلاس (شامل پکیج) به صورت رشته.

  • تفاوت بین getName() و getSimpleName() در کلاس چیست؟ متد getName() نام کامل کلاس را به همراه نام پکیج (Full Qualified Name) برمی‌گرداند، اما getSimpleName() فقط نام خود کلاس را بدون پکیج ارائه می‌دهد.

  • تفاوت متدهای getMethods() و getDeclaredMethods() در چیست؟ متد getMethods() فقط متدهای public کلاس و همچنین متدهای عمومی ارث‌بری شده از کلاس‌های والد (مانند کلاس Object) را برمی‌گرداند. در مقابل، getDeclaredMethods() تمام متدهای تعریف شده در خودِ آن کلاس (شامل متدهای private) را برمی‌گرداند اما متدهای ارث‌بری شده را شامل نمی‌شود. این تفاوت در مورد Fields و Constructors نیز به همین صورت است.

  • چگونه می‌توان متادیتاهای عددی (Modifiers) را به کلمات قابل فهم تبدیل کرد؟ خروجی متد getModifiers() یک عدد صحیح است. برای تبدیل این عدد به کلمات کلیدی جاوا، باید از متد استاتیک Modifier.toString(int) استفاده کرد.

  • چرا استفاده از Class.forName() نیاز به مدیریت Exception دارد؟ چون نام کلاس به صورت یک رشته (String) به متد پاس داده می‌شود، احتمال اشتباه تایپی یا نبودن آن کلاس در مسیر پروژه وجود دارد؛ لذا جاوا ما را مجبور به مدیریت خطای ClassNotFoundException می‌کند.

سناریو کاربردی

در این آموزش، با استفاده از کلاس‌هایی به نام Person و A نشان داده شد که چگونه می‌توان بدون داشتن دانش قبلی از محتوای یک کلاس در زمان کدنویسی، تمام جزئیات آن را در زمان اجرا استخراج کرد. به عنوان مثال، با فراخوانی متد getSuperclass() روی Class Object مربوط به کلاس Person مشاهده شد که اگر کلاسی به طور صریح از جایی ارث‌بری نکند، والد مستقیم آن کلاس Object خواهد بود. همچنین با تعریف یک سازنده private در کلاس A و استفاده از getDeclaredConstructors()، توانستیم به سازنده‌ای دسترسی پیدا کنیم که در حالت عادی و خارج از محیط رفلکشن، قابل مشاهده و دسترسی نیست. این سناریو نشان داد که رفلکشن چگونه می‌تواند لایه‌های امنیتی و دسترسی‌های کلاس را برای بازرسی فنی باز کند.

بیشتر بدانید

  • نکته مدیریت خطا هنگام کار با Class.forName()، اگر نام پکیج را به درستی وارد نکنید یا کلاس وجود نداشته باشد، برنامه با خطای ClassNotFoundException متوقف می‌شود. همیشه از نام کامل پکیج استفاده کنید.

  • نکته فنی در IDE در محیط‌هایی مانند IntelliJ، زمانی که از متدهای رفلکشن استفاده می‌کنید، IDE به شما هشدار می‌دهد که متد مورد نظر ممکن است وجود نداشته باشد (NoSuchFieldException یا NoSuchMethodException) و از شما می‌خواهد که کد را درون بلوک try-catch قرار دهید.

  • نکته بازرسی اعضا اشیاء برگردانده شده از نوع Field یا Method خود دارای متدهای داخلی هستند که اجازه می‌دهند نوع بازگشتی (getReturnType) یا نوع پارامترهای ورودی را به صورت دقیق بررسی کنید.