آرایهها (Arrays) در ماشین مجازی جاوا پیادهسازی شدهاند. تنها متدهای آرایهها آنهایی هستند که از Object ارث برده شدهاند. طول یک آرایه بخشی از Type آن نیست؛ آرایهها یک فیلد length دارند که از طریق Array.getLength(Object) قابل دسترسی است.
Reflection متدهایی برای دسترسی به Type آرایهها و Type کامپوننتهای آنها، ایجاد آرایههای جدید و بازیابی و تنظیم مقادیر کامپوننتها فراهم میکند.
Type آرایهها را میتوان با فراخوانی Class.isArray() شناسایی کرد.
میتوانید Type دقیق آرایه داخلی یک شیء String را با کد زیر دریافت کنید:
Class<?> c = String.class;
Field field = c.getDeclaredField("value");
Class<?> fieldType = field.getType();
boolean isArray = fieldType.isArray();
IO.println("isArray = " + isArray);
Class<?> elementType = fieldType.getComponentType();
IO.println("elementType = " + elementType);
خروجی:
isArray = true
elementType = byte
درست مثل کد غیرReflective، Reflection نیز از قابلیت ایجاد پویا (Dynamic) آرایههای با Type و ابعاد دلخواه از طریق java.lang.reflect.Array.newInstance() پشتیبانی میکند.
کلاس Array مجموعهای از متدهای ایستا برای دریافت اطلاعات Reflective درباره آرایهها، همچنین تنظیم و خواندن عناصر هر آرایه ارائه میدهد.
بیایید کد زیر را بررسی کنیم:
int length = 10;
Object o = Array.newInstance(int.class, 10);
boolean isArray = o.getClass().isArray();
IO.println("isArray = " + isArray);
Class<?> componentType = o.getClass().getComponentType();
IO.println("componentType = " + componentType);
int reflectiveLength = Array.getLength(o);
IO.println("reflectiveLength = " + reflectiveLength);
for (int i = 0; i < reflectiveLength; i++) {
Array.set(o, i, 2*i);
}
IO.println(Arrays.toString((int[])o));
بیایید کد بالا را خط به خط توضیح دهیم:
Array.newInstance(int.class, 10): یک نمونه جدید از آرایهای با ۱۰ عنصر int ایجاد میکند.o.getClass().isArray(): بررسی میکند آیا کلاس مربوطه یک آرایه است یا خیر.o.getClass().getComponentType(): Type کامپوننتهای این آرایه را برمیگرداند. در این مورد، int است.Array.getLength(o): طول این آرایه را برمیگرداند.Array.set(o, i, 2*i): مقدار عنصر iاُم آرایه o را بهصورت Reflective برابر با 2*i تنظیم میکند. همچنین میتوانید مقدار عنصر iاُم را با فراخوانی Array.get(o, i) بازیابی کنید.توجه کنید که کلاس Array متدهایی برای تنظیم مقادیر اولیه (Primitive) بدون Boxing و Unboxing دارد. بهعنوان مثال، میتوانید از Array.setDouble() و Array.getDouble() برای تنظیم و خواندن عناصر یک آرایه double استفاده کنید.
دو نکته هنگام استفاده از این متدها وجود دارد:
Array.setFloat() با یک شیء Float بهجای Type اولیه float باعث پرتاب IllegalArgumentException میشود.Array.setInt() با پاس دادن یک آرایه long مجاز است، چون تبدیل int به long باعث از دست رفتن دقت نمیشود. اما عکس آن غیرمجاز است. نمیتوانید Array.setLong() را با یک آرایه int فراخوانی کنید، چون باعث Narrowing و از دست رفتن دقت میشود.خروجی:
isArray = true
componentType = int
reflectiveLength = 10
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
توجه کنید که تلاش برای خواندن یا نوشتن عناصر در اندیسی بزرگتر از طول آرایه، ArrayIndexOutOfBoundsException پرتاب میکند.
این محتوا کاملا رایگان توسط تیم کدلپر ترجمه شده و در اختیار شما کاربران عزیز قرار گرفته است، هر گونه کپی برداری برای مقاصد غیر رایگان و بدون ذکر منبع، مورد پیگیری قانونی قرار میگیرد.
ترجمه شده از منبع: https://dev.java/learn/