需要被代理的接口和类。注意:必须要定义接口。
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动态代理是Java提供的一种在运行时创建代理对象的技术,它是通过实现InvocationHandler接口和使用Proxy类来实现的。在Spring框架中,AOP(面向切面编程)就是基于Java动态代理来完成的,用于实现横切关注点,如...
本文将深入探讨Struts2拦截器的原理以及它与Java中的动态代理之间的联系。 首先,让我们了解Struts2拦截器的基本工作原理。拦截器在Action执行前后被调用,形成一个拦截器链。每当一个HTTP请求到达,Struts2的...
Java 动态代理是实现AOP(面向切面编程)的一种常见方式,尤其适用于日志记录、性能统计、安全控制和事务处理等横切关注点的分离。在Java中,从JDK 1.2开始,`java.lang.reflect.Proxy`类和`java.lang.reflect....
这个压缩包中包含的实例源码涵盖了多种设计模式,包括工厂模式、动态代理和责任链模式。让我们深入探讨这些设计模式的核心概念、用途以及它们在实际编程中的应用。 1. 工厂模式:这是最基础的设计模式之一,属于...
Java中的动态代理、反射和拦截器是面向对象编程中非常重要的技术,它们在实现灵活性、扩展性和代码解耦方面发挥着关键作用。本资源提供的示例涵盖了这些核心概念,通过JDK动态代理、CGLIB动态代理以及拦截器链的实践...
代码 博文链接:https://callan.iteye.com/blog/161806
当然,实际的项目可能会涉及更多细节,如支持HTTPS、代理链、重定向处理、代理认证等。提供的压缩包文件可能包含有关此主题的教程、代码示例和相关资源,可以进一步研究和学习。在实践中不断优化和改进,你的Java ...
- **防盗链处理**:常见的防盗链策略有检查Referer字段,可以伪造Referer或使用代理IP绕过限制。 - **缓存机制**:为了节省网络带宽和提高下载速度,可以使用本地缓存,避免重复下载。 4. **文件操作**: - **...
以下是关于JAVA设计模式中提及的四种模式——工厂模式、代理模式、迭代器模式以及责任链模式的详细说明。 1. **工厂模式**:工厂模式是一种创建型设计模式,它提供了一种创建对象的最佳方式。在工厂模式中,当创建...
Java代理源码主要涉及到的是Java编程中的动态代理和网络代理技术。在Spring MVC框架下,开发者经常使用代理模式来扩展或增强对象的功能,同时,这里的"代理.war"文件表明这是一个Web应用程序,通常用于部署在如...
在实际开发中,你可能会遇到更复杂的情况,如处理代理链、处理SSL连接或处理不支持代理的库。这时,可能需要使用`java.net.SocketFactory`或`javax.net.ssl.SSLSocketFactory`来创建自定义的套接字工厂,以便在建立...
本文主要讲述如何利用Java编程语言中的Jsoup库和HttpClient工具包来获取和解析动态生成的数据,特别是那些通过JavaScript动态加载的数据。 ### Java爬虫基础 Java爬虫是指使用Java语言编写的一类程序,这些程序...
JDK动态代理基于Java的接口机制实现,因此,要使用JDK动态代理,被代理的目标类必须实现至少一个接口。`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口是JDK动态代理的核心。Proxy类用于...
在Java编程中,动态代理是一种强大的技术,它允许我们在运行时创建对象的代理,以便在调用实际方法之前或之后执行额外的操作。JDK和CGLIB是两种常用的实现Java动态代理的方式。本文将深入探讨这两个库以及它们的工作...
在Java中,可以使用`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来实现动态代理。 2. **Spring中的动态代理类型** Spring支持两种类型的动态代理:JDK动态代理和CGLIB代理。 - **JDK...
动态代理则是Java提供的一种机制,允许在运行时创建接口的实现类实例,从而实现对对象行为的扩展或增强。 Struts拦截器的运作原理: 1. **拦截器链**:Struts2的拦截器工作在一个预定义的拦截器链上,这个链由多个...
本篇文章将深入探讨Spring AOP中的动态代理、责任链模式以及注解的使用。 首先,动态代理是实现AOP的关键技术之一。在Java中,有两种主要的动态代理实现方式:JDK动态代理和CGLIB。JDK动态代理基于接口,当目标类...
本教程将深入探讨两个关键的Java技术:动态代理和Java 8的新特性,特别是方法引用的使用。让我们逐一解析这些概念。 首先,动态代理在Java中是一种创建代理对象的技术,它允许我们在运行时创建一个实现一组给定接口...
在本教程中,我们将深入探讨Java编程中的两个关键概念:动态代理和Java 8的新特性,特别是关于Stream API的终止操作——收集。首先,我们来理解动态代理。 动态代理是Java提供的一种机制,允许在运行时创建代理类,...