实践一下动态代理

xiaoxiao2021-02-28  164

Java实现动态代理涉及Proxy和InvocationHandler两个类。

此处的代码想要模范AOP的日志模块

// LogIntercepter.java

import java.lang.reflect.InvocationHandler; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import spring.dao.impl.UserDAOImpl; import spring.model.User; public class LogIntercepter implements InvocationHandler { Object obj; //被代理的目标 public Object getObj() { return obj; } public void setObj(Object obj) { this.obj = obj; } public void beforeMethod(Method m) { System.out.println(m.getName()); } @Override public Object invoke(Object proxy, Method method, Object... args) throws Throwable { beforeMethod(method); return method.invoke(proxy, args); } public static void main(String[] args) throws NoSuchMethodException, SecurityException, Throwable { LogIntercepter intercepter = new LogIntercepter(); LogProxy log = new LogProxy(); intercepter.setObj(log); intercepter.invoke(log, log.getClass().getMethod("beforeSave")); } }

此处要调用reflect的Method类,用于获取被代理对象的方法;写了一个测试方法,用反射机制调用beforeSav()方法;

//LogProxy.java

public class LogProxy { public void beforeSave() { System.out.println("before save"); } }

之后就可以通过LogIntercepter调用obj的指定方法,可以再设定一类接口,规定好方法,之后就可以动态指定各类方法了。

转载请注明原文地址: https://www.6miu.com/read-21219.html

最新回复(0)