Reflection در برنامه نویسی این قابلیت را به برنامه نویس میدهد که در زمان اجرای برنامه بدون دانستن نام یک کلاس یا اینترفیس ، متدها و فیلد های آن را فراخوانی نمایید ، اطلاعاتی در باره آنها کسب کنید ، آن ها را مقدار دهی کرده یا value آنها را بخواند . با استفاده از Reflection حتی میتوان به فیلد های private هم دسترسی پیدا کرد .
یکی از کاربردهای مهم Reflection خصوصا در زبان جاوا برای ساخت Fraimework میباشد . 
هنگامی که در جاوا از یک کلاس یک object جدید میسازیم حتما باید نام آن کلاس را دانسته و همچنین آن کلاس در claspath وجود داشته باشد  و با کد زیر یک object جدید از شی مورد نظر ساخته میشود .
User user = new User();​

حالا پس از ساختن object جدید از شی User میشود متد toString آن را صدا زد ، حال فرض کنید که در زمان اجرا کلاس های مختلفی داریم و نام هیج یک از آنها را نیز نمیدانیم ولی قصد داریم متد toString آنها را صدا بزنیم ، اینجا کاربرد Reflection مشخص میشود چون هنوز هیچ کدام از کلاس های مورد نظر ما به وجود نیامده اند . 

برای دسترسی پیدا کردن به فیلد های یک object در جاوا به وسیله Reflection میتوان به صورت زیر عمل کرد.

class User{
    private String firstName;
    
    private String lastName;

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    @Override
    public String toString() {
        return "User{" +
                "firstName='" + firstName + '\'' +
                ", lastName='" + lastName + '\'' +
                '}';
    }
}
import  User;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class main {

    public static void main(String[] args) {
        Class user = User.class;
        // آرایه ای از فیلدها برای دسترسی به فیلدهای کلاس موردنظر
        Field[] fields = user.getDeclaredFields();
        for (Field field : fields) {
            System.out.println(String.format("%s %s","field_name:",field.getName()));
            System.out.println(String.format("%s%s","field_type:",field.getType().getTypeName()));
            System.out.println("*************************");       
 }
         // آرایه ای از متدها برای دسترسی به متدهای کلاس موردنظر
        Method[] methods = user.getDeclaredMethods();
        for (Method method : methods) {
            System.out.println(String.format("%s %s","method_name:",method.getName()));
            System.out.println(String.format("%s %s","method_returnType:",method.getReturnType()));
            System.out.println("*************************");
        }
    }
}
//خروجی

field_name: firstName
field_type: java.lang.String
*************************
field_name: lastName
field_type: java.lang.String
*************************
method_name: toString
method_returnType: class java.lang.String
*************************
method_name: getFirstName
method_returnType: class java.lang.String
*************************
method_name: setFirstName
method_returnType: void
*************************
method_name: getLastName
method_returnType: class java.lang.String
*************************
method_name: setLastName
method_returnType: void
*************************
 

برای مقداری دهی یا invok کردن متدهای setter میتوان از روش زیر استفاده کرد .

public class main {

    public static void main(String[] args) throws IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {
        Object object = User.class.newInstance();
        Method setFirstNameMethod = object.getClass().getDeclaredMethod("setFirstName", String.class);
        Method setLastNameMethod = object.getClass().getDeclaredMethod("setLastName", String.class);
        setFirstNameMethod.invoke(object,"Reza");
        setLastNameMethod.invoke(object,"Eskandari");
        System.out.println(object.toString());
    }
}

// خروجی 
User{firstName='Reza', lastName='Eskandari'}

هم چنین برای مقدار دهی به فیلدها و متدهایی که به اسامی و تایپ آنها دسترسی نداریم میتوان به شیوه زیر عمل کرد .

public class main {

    public static void main(String[] args) throws IllegalAccessException, InstantiationException {
        Object object = Userr.class.newInstance();
        Field[] fields = object.getClass().getDeclaredFields();
        Method[] methods = object.getClass().getDeclaredMethods();
        Map<String, String> userData = new HashMap<>();
        userData.put("firstName", "Reza");
        userData.put("lastName", "Eskandari");
        for (Method method : methods) {
            for (Field field : fields) {
                // با این دستور میتوان به فیلد های پرایویت دسترسی یافت 
                field.setAccessible(true);
                if (method.getName().startsWith("set")
                        && method.getName().length() == field.getName().length() + 3){
                      if (field.getType().getSimpleName().endsWith("String")){
                        field.set(object,userData.get(field.getName()));
                    }
                }
            }
        }
        System.out.println(object.toString());
    }
}

//خروجی
User{firstName='Reza', lastName='Eskandari'}