`
chinrui
  • 浏览: 97688 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

使用JDK中的InvocationHandler、Proxy实现动态代理

阅读更多
动态代理(Dynamic Proxy)

一、切面编程(在方法前后加上一些逻辑,如下:在save(User user)方法前后加逻辑)
准备工作:
public class UserDAOImpl {
	public void save(User user) {
		System.out.println("user saved!");
	}
}

1、实现方法一:直接在方法里面逻辑前后进行添加
public class UserDAOImpl implements UserDAO {
	public void save(User user) {
		System.out.println("user start");   //在方法前添加逻辑
		System.out.println("user saved!");
	}
}

2、实现方法二:使用继承进行添加
public class UserDAOImpl2 extends UserDAOImpl {
	@Override
	public void save(User user) {
		System.out.println("user start");   //在方法前添加逻辑
		super.save(user);
	}
}

3、实现方法三:使用接口进行添加
添加接口UserDAO
public interface UserDAO {
	public void save(User user);
}

让UserDAOImpl继承接口
public class UserDAOImpl implements UserDAO {
	public void save(User user) {
		System.out.println("user saved!");
	}
}

让UserDAOImpl2继承接口
public class UserDAOImpl2 implements UserDAO {
	
	private UserDAOImpl userDAOImpl = new UserDAOImpl();
	
	public void save(User user) {
		System.out.println("user start");   //在方法前添加逻辑
		userDAOImpl.save(user);
	}
}

小总结:三种方法中,使用接口和组合最为合适,但是如果要添加逻辑的方法十分多,而且因继承接口而形成的结构十分复杂的时候,可以使用动态代理来帮助实现。
二、使用动态代理添加逻辑
将所需要添加的逻辑封装成一个类,让其继承InvocationHandler接口
public class LogInterceptor implements InvocationHandler {

	private Object target;  //需要添加逻辑的对象
	
	public LogInterceptor(Object target) {
		this.target = target;
	}
	
	public void log(Method m) {
		System.out.println(m.getName() + " start");
	}

	/*
	 * proxy 代理对象
	 * method 代理对象要执行的方法
	 * args 所需执行方法的参数
	 */
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		log(method);    //在执行方法前添加逻辑
		method.invoke(target , args);
		return null;
	}

}

使用Proxy获得代理对象,代理对象与被代理对象要实现同样的接口
public class TestProxy {
	/*
	 * userDAO 要代理的对象,实现了UserDAO接口
	 * li 给代理添加逻辑的类
	 * proxy 通过Proxy的静态方法生成的代理对象
	 * 代理对象与被代理的对象的ClassLoader要一样
	 * 通过传入的参数,实现与代理对象同样的接口
	 */
	public void testProxy() {
		UserDAO userDAO = new UserDAOImpl();
		LogInterceptor li = new LogInterceptor(userDAO);  
		UserDAO proxy = (UserDAO)Proxy.newProxyInstance(
				userDAO.getClass().getClassLoader(), new Class[]{UserDAO.class}, li);
		proxy.save(new User());
		proxy.delete();
	}
}

分享到:
评论

相关推荐

    JDK动态代理_JDK动态代理

    3. **创建动态代理对象**:使用`Proxy.newProxyInstance`方法创建动态代理对象,传入ClassLoader、接口数组和上一步骤创建的InvocationHandler实例。 4. **调用代理对象的方法**:当调用代理对象的方法时,会自动...

    JDK动态代理proxy

    下面是一个简单的JDK动态代理示例,我们创建一个计算服务接口`Calculator`,然后使用动态代理来实现该接口,并在代理对象中添加日志功能。 ```java // 目标接口 interface Calculator { int add(int a, int b); } ...

    浅谈JDK动态代理与CGLIB代理去区别

    在"通过Configuration文件实现AOP.docx"文档中,可能会详细讲述如何在Spring配置文件中配置AOP代理,包括如何选择使用JDK动态代理还是CGLIB。 总结来说,JDK动态代理简单且高效,适合接口驱动的设计,而CGLIB适用于...

    AOP__使用JDK中的Proxy技术实现AOP功能

    在Java中,我们可以使用JDK的动态代理(Proxy)来实现AOP的功能,这主要涉及到反射和接口编程。 **JDK动态代理的工作原理** JDK的Proxy类提供了一种机制,可以创建一个代理对象,该对象在调用方法时会执行自定义的...

    jdk动态代理技术详解

    例如,可以使用动态代理来实现记忆功能、数据库连接池、事务控制、AOP 等。动态代理的优点在于可以在不修改原有代码的情况下,增加新的功能,从而提高软件的灵活性和扩展性。 结论 JDK 动态代理技术是 Java 语言...

    使用JDK中的Proxy技术实现AOP功能与使用CGLIB实现AOP功能

    本篇将深入探讨如何使用JDK的动态代理和CGLIB库来实现Spring中的AOP功能。 首先,我们来看JDK中的Proxy技术。JDK Proxy是Java提供的一种动态代理机制,它允许我们在运行时创建一个实现了特定接口的新类。这个新类...

    关于jdk动态代理的源码剖析

    - **只能代理实现了接口的类**:这是JDK动态代理的一个限制,如果目标对象没有实现任何接口,则无法使用JDK动态代理。 - **性能开销**:虽然这种开销通常很小,但在高并发场景下可能会成为瓶颈。 通过上述分析,...

    Jdk动态代理和cglib动态代理原理

    JDK动态代理是Java内置的一种机制,依赖于`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口。以下是JDK动态代理的基本工作原理: 1. **InvocationHandler接口**:这是处理代理对象方法调用...

    jdk动态代理和CGlib动态代理

    JDK动态代理和CGlib动态代理是Java中实现这一目标的两种主要方式。 ### JDK动态代理 JDK动态代理基于Java的接口实现。如果一个类实现了至少一个接口,我们就可以为这个类创建一个动态代理。动态代理通过`java.lang....

    模拟JDK动态代理内部实现

    Java中的动态代理通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口实现。`Proxy`类用于创建一个实现了特定接口的代理对象,而`InvocationHandler`接口定义了处理代理对象方法调用的逻辑...

    AOP_1.入门及使用JDK中的Proxy技术实现实例

    在Java领域,我们可以使用Spring框架提供的AOP支持,但本实例主要讨论的是如何使用JDK自身的动态代理(Proxy)技术来实现AOP。 JDK的Proxy类提供了创建动态代理对象的能力,这个代理对象可以代表一个或多个实现了...

    Spring Aop的底层实现技术 --- Jdk动态代理原理

    在使用 JDK 动态代理时,需要实现 InvocationHandler 接口,并在 invoke 方法中定义横切逻辑。通过反射机制,InvocationHandler 可以调用目标类的方法,并将横切逻辑和业务逻辑编织在一起。 在 Spring AOP 中,JDK ...

    JDK和CGlib分别实现的动态代理源代码

    JDK和CGlib是两种常用的动态代理实现方式,它们各自有不同的特性和使用场景。 首先,我们来详细了解一下JDK动态代理。JDK动态代理基于接口实现,它要求被代理的对象必须实现至少一个接口。通过`java.lang.reflect....

    代理模式-静态动态代理-jdk动态代理-cglib动态代理

    JDK动态代理通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口实现。 ```java // 创建InvocationHandler public class MyInvocationHandler implements InvocationHandler { private ...

    JAVA动态代理实现Demo(JDK动态代理和CGLIB动态代理)

    Java动态代理是Java编程中一个重要的特性,它允许我们在运行...在实际开发中,如果目标类已经实现了接口,通常优先选择JDK动态代理,因为它更简单且不需要额外依赖;而在无法满足接口条件时,CGLIB则是很好的替代方案。

    JDK动态代理和Cglib动态代理实例源码

    首先,JDK动态代理是Java内置的一种机制,它依赖于`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口。`Proxy`类用于创建代理对象,而`InvocationHandler`接口定义了处理代理对象方法调用的...

    java-jdk动态代理的实现demo

    在Java中,JDK提供了一个`java.lang.reflect.Proxy`类和一个`java.lang.reflect.InvocationHandler`接口,它们是实现动态代理的关键。Proxy类用于创建代理对象,而InvocationHandler接口定义了处理方法调用的逻辑。 ...

    JDK动态代理和CGLIB代理

    JDK动态代理主要通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来实现。Proxy类用于创建一个代理对象,而InvocationHandler接口定义了处理代理对象的方法调用的逻辑。当通过Proxy创建...

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

    - `MethodInterceptor`接口类似于JDK动态代理中的`InvocationHandler`,但它的拦截逻辑更为灵活,可以在`intercept()`方法中控制目标方法的调用。 3. **FastClass和MethodProxy** - CGLIB通过`FastClass`和`...

    JDK动态代理简单示例

    在Java中,动态代理是通过java.lang.reflect包下的两个类实现的:Proxy和InvocationHandler。Proxy类用于创建代理对象,而InvocationHandler接口则定义了处理代理对象方法调用的逻辑。 1. **Proxy类**: - Proxy类...

Global site tag (gtag.js) - Google Analytics