Reflection در برنامه های جاوا این امکان را فراهم می سازد که در زمان اجرای یک برنامه شما بتوانید بدون دانستن نام یک کلاس، interface ، فیلد یا متد آنها را فراخوانی کنید و اطلاعاتی در باره آنها کسب کنید.
کاربرد اصلی Reflection برای ساختن فریم ورک ها است و همچنین ابزاری قدرتمند برای نوشتن برنامه هایی است که می توانند در زمان اجرا تصمیماتی را بگیرند.
یک مثال می زنم: برای اینکه در جاوا از یک کلاس شئ بسازید حتما باید نام آن را بدانید و آن کلاس نیز در classpath برنامه شما قرار داشته باشد و سپس با کد زیر یک شئ از آن بسازید:
MyClass obj = new MyClass();
حال می توانید متد doSomething را از این کلاس فراخوانی کنید. حالا می خواهیم یک برنامه بنویسیم که نقش یک container را دارد، بدین صورت که در زمان اجرا کلاس های مختلفی به آن داده می شود و آن برنامه باید متد doSomething آن کلاس ها را فراخوانی کند. اینجا است که Reflection بکار می آید چون در زمان کد نویسی ما نمی دانیم نام آن کلاس ها چیست و همچنین آن کلاس ها هنوز بوجود نیامده اند بنابراین در classpath برنامه نیز قرار ندارند.
برای قرار دادن یک کلاس در classpath برنامه از قابلیت Dynamic Class Loading در Reflection استفاده می کنیم و سپس با استفاده از Reflection یک شئ از کلاس های جدید در زمان اجرا می سازیم:
Constructor constructor = MyObject.class.getConstructor(String.class);
MyObject myObject = (MyObject) constructor.newInstance("constructor-arg1");
و در نهایت هم با استفاده از Reflection لیست متد های کلاس را بدست می آوریم و متد doSomething را از بین آنها پیدا کرده و فراخوانی می کنیم:
Method[] methods = MyObject.class.getMethods();
for(Method method : methods){
// condition
System.out.println("method = " + method.getName());
}