`

Java动态代理链

阅读更多
需要被代理的接口和类。注意:必须要定义接口。
package com.yan.proxy.object;

public interface ProxyObjectI {
	public void sayHello();
}
被代理的类
package com.yan.proxy.object;

public class ProxyedObject implements ProxyObjectI{
	@Override
	public void sayHello() {
		System.out.println("hello");
	}
	
}
两个代理类authority log
package com.yan.proxy.object;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

public class AuthorityProxy implements InvocationHandler {

	private Object proxy;
	
	
	@Override
	public Object invoke(Object obj, Method method, Object[] args)
			throws Throwable {
		
		doBefore();
		Object result =  method.invoke(proxy, args);
		doAfter();
		return result;
	}
	
	public AuthorityProxy(Object proxy) {
		this.proxy = proxy;
	}

	private void doBefore() {
		System.out.println("before you are authoried! ");
	}
	
	private void doAfter() {
		System.out.println("after you are authoried! ");
	}

}


package com.yan.proxy.object;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

public class LogProxy implements InvocationHandler {

	private Object proxy;
	
	
	public LogProxy(Object proxy) {
		this.proxy = proxy;
	}

	@Override
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		doBefore();
		Object result = method.invoke(this.proxy, args);
		doAfter();
		return result;
	}
	
	private void doBefore() {
		System.out.println("before logging.............. ");
	}
	
	private void doAfter() {
		System.out.println("after logging..............");
	}

}

测试类
package com.yan.proxy.object;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;

public class Test {

	public static void main(String[] args) throws InstantiationException, IllegalAccessException {
		
		ProxyObjectI object = new ProxyedObject();
		InvocationHandler authHandler = new AuthorityProxy(object);
		ProxyObjectI authProxy = (ProxyObjectI) Proxy.newProxyInstance(object.getClass().getClassLoader(), object.getClass().getInterfaces(), authHandler);
		InvocationHandler logHandler = new LogProxy(authProxy);
		ProxyObjectI proxy = (ProxyObjectI) Proxy.newProxyInstance(authProxy.getClass().getClassLoader(), authProxy.getClass().getInterfaces(), logHandler);
		proxy.sayHello();
		
	}
}

输出结果:

before logging..............
before you are authoried!
hello
after you are authoried!
after logging..............
可以看到对象被一层一层的代理对象所封装。
分享到:
评论

相关推荐

    Java动态代理(Spring Aop原理)

    Java动态代理是Java提供的一种在运行时创建代理对象的技术,它是通过实现InvocationHandler接口和使用Proxy类来实现的。在Spring框架中,AOP(面向切面编程)就是基于Java动态代理来完成的,用于实现横切关注点,如...

    Struts2 拦截器 和 Java 中的动态代理

    本文将深入探讨Struts2拦截器的原理以及它与Java中的动态代理之间的联系。 首先,让我们了解Struts2拦截器的基本工作原理。拦截器在Action执行前后被调用,形成一个拦截器链。每当一个HTTP请求到达,Struts2的...

    用Java动态代理实现AOP

    Java 动态代理是实现AOP(面向切面编程)的一种常见方式,尤其适用于日志记录、性能统计、安全控制和事务处理等横切关注点的分离。在Java中,从JDK 1.2开始,`java.lang.reflect.Proxy`类和`java.lang.reflect....

    java设计模式(工厂模式,动态代理,责任链模式……)实例源码

    这个压缩包中包含的实例源码涵盖了多种设计模式,包括工厂模式、动态代理和责任链模式。让我们深入探讨这些设计模式的核心概念、用途以及它们在实际编程中的应用。 1. 工厂模式:这是最基础的设计模式之一,属于...

    Jdk动态代理,cglib动态代理,反射和拦截器(链)示例

    Java中的动态代理、反射和拦截器是面向对象编程中非常重要的技术,它们在实现灵活性、扩展性和代码解耦方面发挥着关键作用。本资源提供的示例涵盖了这些核心概念,通过JDK动态代理、CGLIB动态代理以及拦截器链的实践...

    java动态代理

    代码 博文链接:https://callan.iteye.com/blog/161806

    Java写http代理服务器

    当然,实际的项目可能会涉及更多细节,如支持HTTPS、代理链、重定向处理、代理认证等。提供的压缩包文件可能包含有关此主题的教程、代码示例和相关资源,可以进一步研究和学习。在实践中不断优化和改进,你的Java ...

    Java爬虫小例子,爬取小网站,突破防盗链下载图片

    - **防盗链处理**:常见的防盗链策略有检查Referer字段,可以伪造Referer或使用代理IP绕过限制。 - **缓存机制**:为了节省网络带宽和提高下载速度,可以使用本地缓存,避免重复下载。 4. **文件操作**: - **...

    JAVA 设计模式 工厂模式 代理模式 迭代模式 责任链模式 源码

    以下是关于JAVA设计模式中提及的四种模式——工厂模式、代理模式、迭代器模式以及责任链模式的详细说明。 1. **工厂模式**:工厂模式是一种创建型设计模式,它提供了一种创建对象的最佳方式。在工厂模式中,当创建...

    java代理源码

    Java代理源码主要涉及到的是Java编程中的动态代理和网络代理技术。在Spring MVC框架下,开发者经常使用代理模式来扩展或增强对象的功能,同时,这里的"代理.war"文件表明这是一个Web应用程序,通常用于部署在如...

    java LAN使用代理服务器

    在实际开发中,你可能会遇到更复杂的情况,如处理代理链、处理SSL连接或处理不支持代理的库。这时,可能需要使用`java.net.SocketFactory`或`javax.net.ssl.SSLSocketFactory`来创建自定义的套接字工厂,以便在建立...

    Java爬虫Jsoup+httpclient获取动态生成的数据

    本文主要讲述如何利用Java编程语言中的Jsoup库和HttpClient工具包来获取和解析动态生成的数据,特别是那些通过JavaScript动态加载的数据。 ### Java爬虫基础 Java爬虫是指使用Java语言编写的一类程序,这些程序...

    jdk与cglib动态代理与底层实现

    JDK动态代理基于Java的接口机制实现,因此,要使用JDK动态代理,被代理的目标类必须实现至少一个接口。`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口是JDK动态代理的核心。Proxy类用于...

    jdk动态代理 cglib3.0动态代理

    在Java编程中,动态代理是一种强大的技术,它允许我们在运行时创建对象的代理,以便在调用实际方法之前或之后执行额外的操作。JDK和CGLIB是两种常用的实现Java动态代理的方式。本文将深入探讨这两个库以及它们的工作...

    四、Spring源码分析——动态代理

    在Java中,可以使用`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来实现动态代理。 2. **Spring中的动态代理类型** Spring支持两种类型的动态代理:JDK动态代理和CGLIB代理。 - **JDK...

    struts 拦截器动态代理

    动态代理则是Java提供的一种机制,允许在运行时创建接口的实现类实例,从而实现对对象行为的扩展或增强。 Struts拦截器的运作原理: 1. **拦截器链**:Struts2的拦截器工作在一个预定义的拦截器链上,这个链由多个...

    SpringAOP之探秘(动态代理、责任链模式、注解使用)

    本篇文章将深入探讨Spring AOP中的动态代理、责任链模式以及注解的使用。 首先,动态代理是实现AOP的关键技术之一。在Java中,有两种主要的动态代理实现方式:JDK动态代理和CGLIB。JDK动态代理基于接口,当目标类...

    674.672.JAVA基础教程_动态代理与Java8新特性-方法引用的使用情况2(674).rar

    本教程将深入探讨两个关键的Java技术:动态代理和Java 8的新特性,特别是方法引用的使用。让我们逐一解析这些概念。 首先,动态代理在Java中是一种创建代理对象的技术,它允许我们在运行时创建一个实现一组给定接口...

    684.682.JAVA基础教程_动态代理与Java8新特性-Stream的终止操作:收集(684).rar

    在本教程中,我们将深入探讨Java编程中的两个关键概念:动态代理和Java 8的新特性,特别是关于Stream API的终止操作——收集。首先,我们来理解动态代理。 动态代理是Java提供的一种机制,允许在运行时创建代理类,...

Global site tag (gtag.js) - Google Analytics