import java.lang.reflect.Proxy; public class Main public static void main(String[] args) RealUserService realService = new RealUserService();
public interface InvocationHandler public Object invoke(Object proxy, Method method, Object[] args) throws Throwable; reflect 4 proxy
| Feature | JDK Proxy | CGLIB | Byte Buddy | |---------|-----------|-------|-------------| | | Interfaces only | Concrete classes | Both | | Implementation | Reflection | Subclassing (bytecode) | Bytecode generation | | Performance | Medium | High | Highest | | Complexity | Low | Medium | High | | Modern use | Spring AOP (default) | Spring (fallback) | Mocking frameworks | import java
public class RealUserService implements UserService @Override public String getUserName(int userId) return "User_" + userId; @Override public void updateUser(int userId, String newName) System.out.println("Updated user " + userId + " to " + newName); Object[] args) throws Throwable
import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; public class LoggingHandler implements InvocationHandler private final Object target; // real object
@Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable // Log before execution System.out.println("[LOG] Calling: " + method.getName()); if (args != null) for (int i = 0; i < args.length; i++) System.out.println("[LOG] Arg " + i + ": " + args[i]); // Invoke the real method via reflection Object result = method.invoke(target, args); // Log after execution System.out.println("[LOG] Returned: " + result); return result;
Whether you are building aspect-oriented programming (AOP) frameworks, mocking libraries (like Mockito), or intercepting method calls for logging and security, the reflect 4 proxy mechanism is your gateway to runtime metaprogramming.