`

java 动态代理的两种实现方式

阅读更多
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动态代理两种实现方式

    Java实现动态代理的两种方式。 相对来说cglib更加方便。可以实现为实现接口的类(非final类)

    利用Java的反射与代理实现IOC模式

    利用Java的反射与代理实现IOC模式 在Java中,其反射和动态代理机制极其强大,我们可以通过其反 射机制在运行时获取信息。而代理是一种基本的设计模式,它是一种为了提供额外的或不同的操作而插入到真 实对象中的...

    java静态代理和动态代理详解

    Java中提供了一个java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口来实现动态代理。代理类在运行时会根据被代理接口自动生成,并且可以通过InvocationHandler接口对方法进行增强。

    动态代理代码实现

    java 常用的两种动态代理代码实现:jdk动态代理、CGLIB动态代理

    java代理类实现AOP

    博文链接:https://mini-laoshu.iteye.com/blog/200201

    Spring框架+SpringAOP动态代理

    Spring AOP 使用的动态代理主要有两种方式:JDK 动态代理和 CGLIB 代理。 JDK 动态代理:用于代理实现了接口的类。Spring 会使用 java.lang.reflect.Proxy 类来创建代理对象。 CGLIB 代理:用于代理没有实现接口的...

    Java+单例+多例+工厂+枚举+动态代理===》演示

    根据实例化对象的时机单例设计模式又分为以下两种: 1. 饿汉单例设计模式 2. 懒汉单例设计模式 多例设计模式案例演示 #### 多例设计模式的作用 多例模式,是一种常用的软件设计模式。通过多例模式可以保证系统中,...

    Java动态代理的异常处理问题

     具体原因是因为我们通过动态代理终捕获到的异常时经过加工了的,也是捕获的已不再是开始我们希望抛出的异常,加工抛出的异常有两种:  java.lang.reflect.UndeclaredThrowableException  java.

    cgLib与JDK动态代理的用法

    按照代理的创建时期,代理类可以分为两种。 静态代理:由程序员创建或特定工具自动生成源代码,再对其编译。在程序运行前,代理类的.class文件就已经存在了。 动态代理:在程序运行时,运用反射机制动态创建而成。

    java开源包4

    WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使用 Java 来构建交互式 Web 应用。WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 ...

    SpringAOP的实现机制(底层原理)、应用场景等详解,模拟过程的实例

    本资源将深入探讨Spring框架中使用的两种关键的动态代理方式:JDK动态代理和CGLib动态代理。这两种代理方式在Spring AOP中起到关键作用,用于实现横切关注点的切面编程。通过学习它们的原理和实际应用,您将能够更好...

    java非常强的获取客户端真实IP的两种方法

    Java获取客户端真实的IP的两种实现方法,即使通过多级代理也能获取到,很有用

    JavaRpc:JAVA RPC实现,基于动态代理与反射

    文章包括以下两个部分: RPC基本原理 RPC Java实例讲解 废话不多说,现在讲讲RPC到底是什么 RPC基本原理 RPC全程Remote Procedure Call Protocol,即远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务...

    JAVA_API1.6文档(中文)

    java.awt.dnd Drag 和 Drop 是一种直接操作动作,在许多图形用户界面系统中都会遇到它,它提供了一种机制,能够在两个与 GUI 中显示元素逻辑相关的实体之间传输信息。 java.awt.event 提供处理由 AWT 组件所激发的...

    java开源包3

    WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使用 Java 来构建交互式 Web 应用。WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 ...

    java开源包11

    WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使用 Java 来构建交互式 Web 应用。WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 ...

    JAVA上百实例源码以及开源项目

    百度云盘分享 ... Java实现的FTP连接与数据浏览程序,实现实例化可操作的窗口。  部分源代码摘录:  ftpClient = new FtpClient(); //实例化FtpClient对象  String serverAddr=jtfServer.getText();...

    java开源包6

    WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使用 Java 来构建交互式 Web 应用。WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 ...

    java开源包9

    WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使用 Java 来构建交互式 Web 应用。WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 ...

    JAVA上百实例源码以及开源项目源代码

     Java实现的FTP连接与数据浏览程序,实现实例化可操作的窗口。  部分源代码摘录:  ftpClient = new FtpClient(); //实例化FtpClient对象  String serverAddr=jtfServer.getText(); //得到服务器地址  ...

Global site tag (gtag.js) - Google Analytics