`

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提供了两种主要的动态代理实现方式:JDK自身的动态代理(基于接口)和Cglib库。 ### JDK动态代理 JDK动态代理是通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来实现的。Proxy类...

    Java实现动态代理

    Java中的动态代理主要有两种实现方式:JDK动态代理和CGLIB动态代理。 1. **JDK动态代理**: JDK动态代理是基于接口的,它通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来实现。...

    java分页 动态代理 aop实现

    在Java中,有两种实现动态代理的方式: 1. Java.lang.reflect.Proxy:使用Proxy类和InvocationHandler接口,可以为任何实现了相同接口的对象创建代理。 2. CGLIB库:当目标类没有实现接口时,CGLIB库可以通过字节码...

    用Java实现的代理模式之动态代理

    在Java中,代理模式有静态代理和动态代理两种实现方式。本篇将重点讨论"动态代理",这是一种在运行时创建代理对象的技术,使得我们可以在程序运行过程中,根据需要动态地生成具有额外功能的代理类。 动态代理主要由...

    java动态代理机制

    Java动态代理机制是Java语言提供的一种强大的功能,它允许在运行时创建代理对象来实现特定接口,从而可以灵活地扩展或增强已有代码的功能。在Java中,动态代理主要通过两个类来实现:`java.lang.reflect.Proxy` 和 `...

    JAVA静态代理和动态代理

    Java提供了两种主要的代理实现方式:静态代理和动态代理。 **静态代理** 静态代理是程序员手动创建代理类并实现与目标对象相同的接口。代理类和目标类都必须实现相同的接口,这样代理类就可以在调用目标对象方法的...

    Java静态代理与动态代理demo

    Java提供了两种实现代理模式的方式:静态代理和动态代理。 **静态代理** 静态代理是在编译时就已经确定了代理类,通过继承或实现目标接口来创建代理类。以下是一个简单的静态代理实现示例: ```java // 目标接口 ...

    java 动态代理 简单实例

    在Java中,动态代理主要通过两个类来实现:`java.lang.reflect.Proxy` 和 `java.lang.reflect.InvocationHandler`。`Proxy` 类用于生成代理对象,而`InvocationHandler`接口定义了代理对象的方法调用应该如何处理。 ...

    java动态代理模拟实现

    总结起来,Java动态代理提供了一种在运行时创建代理对象的机制,通过 `Proxy` 类和 `InvocationHandler` 接口,我们可以灵活地在方法调用前后插入自定义的行为,实现诸如日志、事务等附加功能,极大地增强了代码的可...

    java 动态代理实现注解日志拦截

    在Java中,动态代理主要由两个类实现:`java.lang.reflect.Proxy` 和 `java.lang.reflect.InvocationHandler`。`Proxy` 类用于创建一个实现了特定接口的代理对象,而`InvocationHandler`接口则定义了处理代理对象...

    Java 动态代理详解(代理模式+静态代理+JDK动态代理+CGLIB动态代理)

    本文主要介绍 Java 中两种常见的动态代理方式:JDK 原生动态代理和 CGLIB 动态代理。 一、 代理模式 代理模式是指程序通过代理类来访问目标对象,以达到对目标对象的控制和增强。代理模式的优点是可以在不改变目标...

    Java动态代理详解; CGLib实现动态代理1

    静态代理的实现有两种方式:聚合和继承。 1. **聚合式静态代理**: 在这种方式中,代理类聚合(拥有)真实对象,它们都实现同一接口。当调用代理类的方法时,代理类会在调用真实对象方法前后添加自己的逻辑。例如...

    一个简单的java动态代理的实例

    在这个简单的Java动态代理实例中,我们将探讨如何利用这两个核心组件来实现代理功能。 首先,我们需要理解代理模式的基本概念。代理模式是一种设计模式,它为其他对象提供一种代理以控制对这个对象的访问。在Java中...

    java动态代理例子

    Java动态代理是Java编程中一个重要的特性,它允许我们在运行时创建代理类,这些代理类可以作为原有类的代理,从而在不修改原有类代码...理解并熟练运用这两种代理机制,能帮助我们在设计和实现复杂系统时更加游刃有余。

    java代理机制 JDK动态代理和cglib代理 详解

    本文将深入探讨两种主要的Java代理实现:JDK动态代理和CGLIB代理。 一、JDK动态代理 JDK动态代理基于接口实现,它要求被代理的类必须实现至少一个接口。在运行时,Java会动态地创建一个新的类,这个类实现了与原始...

    Java 动态代理和Cglib代理(二)

    在Java编程领域,动态代理和Cglib代理是两种常用的技术,用于在运行时创建对象的代理,以实现额外的功能,如AOP(面向切面编程)中的日志、事务管理等。本篇文章将深入探讨这两种代理机制,尤其是Cglib代理。 首先...

Global site tag (gtag.js) - Google Analytics