反射与动态代理:运行时生成代理对象
Java 动态代理通过 InvocationHandler 接口和 Proxy 类,在运行时创建实现指定接口的代理实例,用于 AOP、日志等。 · 难度:入门 · +15XP
反射与动态代理:运行时生成代理对象
java.lang.reflect.Proxy 配合 InvocationHandler 可以为一组接口创建动态代理实例。调用代理对象的方法时,会转发到 InvocationHandler 的 invoke 方法,你可以在其中添加额外逻辑(如日志、权限检查)后再调用真实对象的方法。动态代理要求目标对象必须实现接口。下面示例为 UserService 接口创建代理,在方法调用前后打印日志。
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
interface UserService {
void login(String username);
}
class UserServiceImpl implements UserService {
public void login(String username) {
System.out.println("用户 " + username + " 登录成功");
}
}
public class DynamicProxyDemo {
public static void main(String[] args) {
UserService realService = new UserServiceImpl();
UserService proxy = (UserService) Proxy.newProxyInstance(
realService.getClass().getClassLoader(),
realService.getClass().getInterfaces(),
(Object proxyObj, Method method, Object[] args1) -> {
System.out.println("[日志] 调用方法: " + method.getName());
Object result = method.invoke(realService, args1);
System.out.println("[日志] 方法结束");
return result;
});
proxy.login("Alice");
}
}