بسیاری از عناصر در زبان جاوا دارای Modifier هستند: کلاسها، فیلدها، متدها، Constructor ها و پارامترهای متدها و Constructor ها. این Modifier ها میتوانند قابلیت دید (Visibility) عنصری را که به آن اعمال شدهاند، یا قابلیت Override شدن یا غیرقابل تغییر بودن آن را تغییر دهند. Reflection API پس از دریافت یک رفرنس به عنصر مورد نظر، امکان دسترسی به این Modifier ها را فراهم میکند.
یک کلاس یا عضو کلاس میتواند با یک یا چند Modifier اعلام شود که بر رفتار runtime آن تأثیر میگذارند:
public، protected و privateabstractsealed، non-sealedstaticfinalstrictfpهمه Modifier ها روی همه کلاسها یا اعضا مجاز نیستند. بهعنوان مثال، یک Interface نمیتواند final باشد و یک Enum نمیتواند abstract باشد. کلاس java.lang.reflect.Modifier شامل تعریف برخی Modifier های ممکن است ( شامل sealed و non-sealed نمیشود). همچنین شامل متدهایی است که برای رمزگشایی مجموعه Modifier های بازگرداندهشده توسط Class.getModifiers() استفاده میشوند.
میتوانید Modifier های یک کلاس را با فراخوانی متود getModifiers() آن دریافت کنید. این متود یک عدد int برمیگرداند که هر بیت آن نشاندهنده یک Modifier است. بهعنوان مثال، اگر بیت ۰ تنظیم باشد، به این معنی است که عنصر مربوطه Public است. اگر بیت ۳ تنظیم باشد، به این معنی است که عنصر مربوطه Static است.
رمزگشایی عددی Modifier کار دشواری است. خوشبختانه، کلاس Modifier برای کمک به شما طراحی شده است. این کلاس مجموعهای از متدهای ایستا (Static Methods) ارائه میدهد که هر کدام برای یک Modifier هستند و این عدد را برای شما رمزگشایی میکنند.
بیایید این متود را روی دو مثال ببینیم.
Class<?> s = String.class;
int modifiers = s.getModifiers();
IO.println("Is String final? " + Modifier.isFinal(modifiers));
IO.println("Is String abstract? " + Modifier.isAbstract(modifiers));
خروجی کد بالا:
Is String final? true
Is String abstract? false
کلاس String واقعاً final و غیر abstract است.
همین کد را میتوانید روی Interface Collection نیز امتحان کنید.
Class<?> c = Collection.class;
modifiers = c.getModifiers();
IO.println("Is Collection final? " + Modifier.isFinal(modifiers));
IO.println("Is Collection abstract? " + Modifier.isAbstract(modifiers));
خروجی کد بالا:
Is Collection final? false
Is Collection abstract? true
چون Collection یک Interface است، بهصورت ضمنی abstract است. کامپایلر این Modifier را برای هر Interface اضافه میکند.
متود getModifiers() دو تعریف دارد:
ClassMember که توسط کلاسهای Field، Method و Constructor پیادهسازی شده است.هر دو متود به یک شکل کار میکنند و همان عدد int را برمیگردانند که باید با استفاده از متدهای Factory کلاس Modifier رمزگشایی شود.
از Java SE 20، متود accessFlags() به کلاس Class و Interface Member اضافه شده است. این متود مجموعهای از نمونههای AccessFlag برمیگرداند که خواندن Modifier ها را آسانتر میکند.
AccessFlag یک enum است که Modifier های قابل اعمال روی یک کلاس، فیلد، متود یا Constructor را تعریف میکند.
بیایید AccessFlag را در عمل ببینیم:
Class<?> c = String.class;
Set<AccessFlag> accessFlags = c.accessFlags();
for (AccessFlag accessFlag : accessFlags) {
IO.println("accessFlag = " + accessFlag);
}
خروجی:
accessFlag = PUBLIC
accessFlag = FINAL
accessFlag = SUPER
برخی Modifier ها و Access Flag ها معادل یک به یک دارند، اما نه همه. اطلاعات بیشتر در مستندات enum AccessFlag موجود است.
این محتوا کاملا رایگان توسط تیم کدلپر ترجمه شده و در اختیار شما کاربران عزیز قرار گرفته است، هر گونه کپی برداری برای مقاصد غیر رایگان و بدون ذکر منبع، مورد پیگیری قانونی قرار میگیرد.
ترجمه شده از منبع: https://dev.java/learn/