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提供了两种主要的动态代理实现方式:JDK自身的动态代理(基于接口)和Cglib库。 ### JDK动态代理 JDK动态代理是通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来实现的。Proxy类...
Java中的动态代理主要有两种实现方式:JDK动态代理和CGLIB动态代理。 1. **JDK动态代理**: JDK动态代理是基于接口的,它通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来实现。...
在Java中,有两种实现动态代理的方式: 1. Java.lang.reflect.Proxy:使用Proxy类和InvocationHandler接口,可以为任何实现了相同接口的对象创建代理。 2. CGLIB库:当目标类没有实现接口时,CGLIB库可以通过字节码...
在Java中,代理模式有静态代理和动态代理两种实现方式。本篇将重点讨论"动态代理",这是一种在运行时创建代理对象的技术,使得我们可以在程序运行过程中,根据需要动态地生成具有额外功能的代理类。 动态代理主要由...
Java动态代理机制是Java语言提供的一种强大的功能,它允许在运行时创建代理对象来实现特定接口,从而可以灵活地扩展或增强已有代码的功能。在Java中,动态代理主要通过两个类来实现:`java.lang.reflect.Proxy` 和 `...
Java提供了两种主要的代理实现方式:静态代理和动态代理。 **静态代理** 静态代理是程序员手动创建代理类并实现与目标对象相同的接口。代理类和目标类都必须实现相同的接口,这样代理类就可以在调用目标对象方法的...
Java提供了两种实现代理模式的方式:静态代理和动态代理。 **静态代理** 静态代理是在编译时就已经确定了代理类,通过继承或实现目标接口来创建代理类。以下是一个简单的静态代理实现示例: ```java // 目标接口 ...
在Java中,动态代理主要通过两个类来实现:`java.lang.reflect.Proxy` 和 `java.lang.reflect.InvocationHandler`。`Proxy` 类用于生成代理对象,而`InvocationHandler`接口定义了代理对象的方法调用应该如何处理。 ...
总结起来,Java动态代理提供了一种在运行时创建代理对象的机制,通过 `Proxy` 类和 `InvocationHandler` 接口,我们可以灵活地在方法调用前后插入自定义的行为,实现诸如日志、事务等附加功能,极大地增强了代码的可...
在Java中,动态代理主要由两个类实现:`java.lang.reflect.Proxy` 和 `java.lang.reflect.InvocationHandler`。`Proxy` 类用于创建一个实现了特定接口的代理对象,而`InvocationHandler`接口则定义了处理代理对象...
本文主要介绍 Java 中两种常见的动态代理方式:JDK 原生动态代理和 CGLIB 动态代理。 一、 代理模式 代理模式是指程序通过代理类来访问目标对象,以达到对目标对象的控制和增强。代理模式的优点是可以在不改变目标...
静态代理的实现有两种方式:聚合和继承。 1. **聚合式静态代理**: 在这种方式中,代理类聚合(拥有)真实对象,它们都实现同一接口。当调用代理类的方法时,代理类会在调用真实对象方法前后添加自己的逻辑。例如...
在这个简单的Java动态代理实例中,我们将探讨如何利用这两个核心组件来实现代理功能。 首先,我们需要理解代理模式的基本概念。代理模式是一种设计模式,它为其他对象提供一种代理以控制对这个对象的访问。在Java中...
Java动态代理是Java编程中一个重要的特性,它允许我们在运行时创建代理类,这些代理类可以作为原有类的代理,从而在不修改原有类代码...理解并熟练运用这两种代理机制,能帮助我们在设计和实现复杂系统时更加游刃有余。
本文将深入探讨两种主要的Java代理实现:JDK动态代理和CGLIB代理。 一、JDK动态代理 JDK动态代理基于接口实现,它要求被代理的类必须实现至少一个接口。在运行时,Java会动态地创建一个新的类,这个类实现了与原始...
在Java编程领域,动态代理和Cglib代理是两种常用的技术,用于在运行时创建对象的代理,以实现额外的功能,如AOP(面向切面编程)中的日志、事务管理等。本篇文章将深入探讨这两种代理机制,尤其是Cglib代理。 首先...