Java 动态代理实现的两种方式
2018-01-12 17:28
435 查看
java编程中实现动态有两种方式
方式1: 通过JDK实现, 这里主要用到 java.lang.reflect.InvocationHandler, 这个接口, 实现代码如下:
*注意: 使用jdk实现动态代理, 被代理对象必须实现了某些接口.
调用:
执行结果:
方式2: 通过 CGLIB 来实现动态代理, 实现代码:
输入结果:
方式1: 通过JDK实现, 这里主要用到 java.lang.reflect.InvocationHandler, 这个接口, 实现代码如下:
*注意: 使用jdk实现动态代理, 被代理对象必须实现了某些接口.
import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.time.Instant; public class ProxyFactory implements InvocationHandler { private Object delegate; public Object bind(Object delegate) { this.delegate = delegate; return Proxy.newProxyInstance( delegate.getClass().getClassLoader(), // 获取当前类加载器 delegate.getClass().getInterfaces(), // 获取当前类实现的接口列表 this); // InvocationHandler接口实现类对象 } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { // 在执行代理对象方法之前需要做的事情, 数据校验, 权限控制等等 System.out.println("before: " + Instant.now().getEpochSecond()); // 通过反射执行代理对象的方法 Object invoke = method.invoke(delegate, args); // 执行代理对象方法之后需要做的事情, 例如释放一些特定支援等等 System.out.println("after: " + Instant.now().getEpochSecond()); return invoke; } }
调用:
public interface IUserService { void add(String name, int age); }
public class UserServiceImpl implements IUserService { @Override public void add(String name, int age) { System.out.println("添加用户"); } }
public class DemoApplicationTests { @Test public void testProxy() { IUserService userService = (IUserService)new ProxyFactory().bind(new UserServiceImpl()); userService.add("", 100); } }
执行结果:
方式2: 通过 CGLIB 来实现动态代理, 实现代码:
import org.springframework.cglib.proxy.Enhancer; import org.springframework.cglib.proxy.MethodInterceptor; import org.springframework.cglib.proxy.MethodProxy; import java.lang.reflect.Method; import java.time.Instant; public class CglibFactory implements MethodInterceptor { private Object object; public Object bind(Object object) { this.object = object; Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(this.object.getClass()); enhancer.setCallback(this); return enhancer.create(); } @Override public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable { System.out.println("before: " + Instant.now().getEpochSecond()); Object newObj = methodProxy.invokeSuper(o, objects); System.out.println("after: " + Instant.now().getEpochSecond()); return newObj; } }
import com.example.demo.proxy.CglibFactory; import com.example.demo.serviceimpl.UserServiceImpl; import com.example.demo.serviceinterface.IUserService; import org.junit.Test; public class DemoApplicationTests { @Test public void testProxy() { IUserService userService2 = (IUserService)new CglibFactory().bind(new UserServiceImpl()); userService2.add("", 3); } }
输入结果:
相关文章推荐
- Java实现动态代理的两种方式
- Java实现动态代理的两种方式
- 深入理解java动态代理的两种实现方式(JDK/Cglib)
- java 动态代理两种实现方式
- Java中三种代理方式—— 静态代理与两种动态代理的实现机制
- java动态代理的两种实现方式
- Java实现动态代理的两种方式
- [转]JAVA的动态代理机制及Spring的实现方式
- Spring中AOP的两种代理方式(Java动态代理和CGLIB代理)
- JDK和CGLib两种方式实现动态代理模式
- Java实现动态编译的两种方式
- [原创]JAVA的动态代理机制及Spring的实现方式
- 设计模式(3)-结构型-代理模式(proxy)以及java动态代理的两种方式
- 设计模式(3)-结构型-代理模式(proxy)以及java动态代理的两种方式
- 动态代理及其两种实现方式(JDK、CGLIB)
- spring实现AOP的两种方式以及实现动态代理方式
- JAVA的动态代理机制及Spring的实现方式
- JAVA的动态代理机制及Spring的实现方式
- Java动态代理的两种实现方法
- 两种动态代理的实现方式