$ java -cp target/classes com.ankurm.reflection.ReflectionBasicsDemo == 1. Inspect the class == class: com.ankurm.reflection.Account public long balance[] public void deposit[long] public String owner[] private String secret[] public String[] stack[] public String toString[] public static int twice[int] == 2. Create and call == created: Account[alice, 50] after deposit(25): Account[alice, 75] == 3. The exceptions you will meet == wrong name -> NoSuchMethodException: com.ankurm.reflection.Account.nope() wrong arg type -> IllegalArgumentException: argument type mismatch method threw -> InvocationTargetException wrapping java.lang.IllegalArgumentException: over limit: 5000 private, no opt-in -> IllegalAccessException: class com.ankurm.reflection.ReflectionBasicsDemo cannot access a member of class com.ankurm.reflection.Account with modifiers "private" after setAccessible(true): secret-of-alice == 4. What reflection adds to the stack == direct call: com.ankurm.reflection.Account.stack com.ankurm.reflection.ReflectionBasicsDemo.main through Method.invoke: com.ankurm.reflection.Account.stack jdk.internal.reflect.DirectMethodHandleAccessor.invoke java.lang.reflect.Method.invoke com.ankurm.reflection.ReflectionBasicsDemo.main