Java反射机制理解不足:动态代理实例

原创 水深无声 2024-10-19 23:48 131阅读 0赞

在Java中,反射机制是一种强大的工具,它允许我们在运行时检查类、字段和方法等信息,并对其进行操作。

动态代理是反射机制的一个重要应用。动态代理的主要目的是实现对目标对象的拦截,从而在不改变原代码的前提下,增加额外的功能。

例如,我们有一个服务接口(Service Interface):

  1. public interface Service {
  2. void doSomething();
  3. }

然后我们可以创建一个动态代理类,使用JDK提供的Proxy和InvocationHandler来实现:

  1. import java.lang.reflect.InvocationHandler;
  2. import java.lang.reflect.Method;
  3. import java.lang.reflect.Proxy;
  4. // 假设我们有一个实际的Service实现
  5. public class RealServiceImpl implements Service {
  6. @Override
  7. public void doSomething() {
  8. System.out.println("Doing something...");
  9. }
  10. }
  11. // 动态代理类
  12. class DynamicProxy implements InvocationHandler {
  13. private final Object target;
  14. // 创建动态代理实例,目标为真实服务对象
  15. public DynamicProxy(Object target) {
  16. this.target = target;
  17. }
  18. @Override
  19. public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
  20. System.out.println("Before method execution...");
  21. // 执行原方法
  22. method.invoke(target, args);
  23. System.out.println("After method execution...");
  24. return null;
  25. }
  26. }
  27. // 测试:创建代理对象,调用方法
  28. public class Main {
  29. public static void main(String[] args) {
  30. // 创建真实服务对象
  31. Service realService = new RealServiceImpl();
  32. // 通过反射获取真实服务类中doSomething()方法
  33. Method method = Service.class.getMethod("doSomething");
  34. // 创建动态代理实例,目标为真实服务对象
  35. DynamicProxy proxy = new DynamicProxy(realService);
  36. // 使用代理对象调用方法
  37. Object result = proxy.invoke(null, method, null));
  38. System.out.println("Result: " + result);
  39. }
  40. }

当你运行这个测试类时,你会看到在执行doSomething()方法前后输出的信息。这正是动态代理的体现:不改变目标代码,增加额外的功能。

文章版权声明:注明蒲公英云原创文章,转载或复制请以超链接形式并注明出处。

发表评论

表情:
评论列表 (有 0 条评论,131人围观)

还没有评论,来说两句吧...

相关阅读