java 动态代理的两种实现方式,jdk代理和cglib的代理方式,示例代码:
1.UserService.java
public interface UserService {
public void update();
}
2.UserServiceImpl.java
public class UserServiceImpl implements UserService {
private String user = null;
public UserServiceImpl() {
}
public UserServiceImpl(String user) {
this.user = user;
}
public void update() {
System.out.println("执行更新方法!");
}
public String getUser() {
return user;
}
}
3.JDKProxyFactory.java
public class JDKProxyFactory implements InvocationHandler {
private Object target;
public Object createProxyInstance(Object target) {
this.target = target;
return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
UserServiceImpl userService = (UserServiceImpl) this.target;
Object object = null;
if (userService.getUser() != null) {
object = method.invoke(target, args);
}
return object;
}
}
4.CglibProxyFactory.java
public class CglibProxyFactory implements MethodInterceptor {
private Object target;
public Object createProxyInstance(Object target) {
this.target = target;
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(this.target.getClass());// 非final方法修饰
enhancer.setCallback(this);
return enhancer.create();
}
public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
UserServiceImpl userService = (UserServiceImpl) this.target;
Object object = null;
if (userService.getUser() != null) {
object = method.invoke(target, args);
}
return object;
}
}
5.JunitAOP.java
public class JunitAOP {
@Test
public void testProxyJdk() throws Exception {
JDKProxyFactory proxyFactory = new JDKProxyFactory();
UserService service = (UserService) proxyFactory.createProxyInstance(new UserServiceImpl("xxx"));
service.update();
}
@Test
public void testProxyCglib() throws Exception {
CglibProxyFactory proxyFactory = new CglibProxyFactory();
UserServiceImpl service = (UserServiceImpl) proxyFactory.createProxyInstance(new UserServiceImpl("xxx"));
service.update();
}
}
注:JDK的Proxy.newProxyInstance()方式创建的代理对象必须实现一个接口,
没有实现接口的类要创建代理必须由cglib的方式来创建。
分享到:
相关推荐
Java实现动态代理的两种方式。 相对来说cglib更加方便。可以实现为实现接口的类(非final类)
利用Java的反射与代理实现IOC模式 在Java中,其反射和动态代理机制极其强大,我们可以通过其反 射机制在运行时获取信息。而代理是一种基本的设计模式,它是一种为了提供额外的或不同的操作而插入到真 实对象中的...
Java中提供了一个java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口来实现动态代理。代理类在运行时会根据被代理接口自动生成,并且可以通过InvocationHandler接口对方法进行增强。
java 常用的两种动态代理代码实现:jdk动态代理、CGLIB动态代理
博文链接:https://mini-laoshu.iteye.com/blog/200201
Spring AOP 使用的动态代理主要有两种方式:JDK 动态代理和 CGLIB 代理。 JDK 动态代理:用于代理实现了接口的类。Spring 会使用 java.lang.reflect.Proxy 类来创建代理对象。 CGLIB 代理:用于代理没有实现接口的...
根据实例化对象的时机单例设计模式又分为以下两种: 1. 饿汉单例设计模式 2. 懒汉单例设计模式 多例设计模式案例演示 #### 多例设计模式的作用 多例模式,是一种常用的软件设计模式。通过多例模式可以保证系统中,...
具体原因是因为我们通过动态代理终捕获到的异常时经过加工了的,也是捕获的已不再是开始我们希望抛出的异常,加工抛出的异常有两种: java.lang.reflect.UndeclaredThrowableException java.
按照代理的创建时期,代理类可以分为两种。 静态代理:由程序员创建或特定工具自动生成源代码,再对其编译。在程序运行前,代理类的.class文件就已经存在了。 动态代理:在程序运行时,运用反射机制动态创建而成。
WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使用 Java 来构建交互式 Web 应用。WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 ...
本资源将深入探讨Spring框架中使用的两种关键的动态代理方式:JDK动态代理和CGLib动态代理。这两种代理方式在Spring AOP中起到关键作用,用于实现横切关注点的切面编程。通过学习它们的原理和实际应用,您将能够更好...
Java获取客户端真实的IP的两种实现方法,即使通过多级代理也能获取到,很有用
文章包括以下两个部分: RPC基本原理 RPC Java实例讲解 废话不多说,现在讲讲RPC到底是什么 RPC基本原理 RPC全程Remote Procedure Call Protocol,即远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务...
java.awt.dnd Drag 和 Drop 是一种直接操作动作,在许多图形用户界面系统中都会遇到它,它提供了一种机制,能够在两个与 GUI 中显示元素逻辑相关的实体之间传输信息。 java.awt.event 提供处理由 AWT 组件所激发的...
WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使用 Java 来构建交互式 Web 应用。WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 ...
WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使用 Java 来构建交互式 Web 应用。WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 ...
百度云盘分享 ... Java实现的FTP连接与数据浏览程序,实现实例化可操作的窗口。 部分源代码摘录: ftpClient = new FtpClient(); //实例化FtpClient对象 String serverAddr=jtfServer.getText();...
WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使用 Java 来构建交互式 Web 应用。WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 ...
WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使用 Java 来构建交互式 Web 应用。WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 ...
Java实现的FTP连接与数据浏览程序,实现实例化可操作的窗口。 部分源代码摘录: ftpClient = new FtpClient(); //实例化FtpClient对象 String serverAddr=jtfServer.getText(); //得到服务器地址 ...