今天温故了下动态代理设计模式,顺便写了写笔记,对动态代理添加了些自己的一些想法
以下是一些类的依赖关系

通过上面的动态代理工厂生成任何你需要的代理对象,并传入任何你想要的处理,所以设计了两个接口,如上图所示
下面是动态代理工厂,(这里同时用了静态工厂设计模式)通过getproxy方法获得代理对象
package Factory;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
//动态代理工厂
public class ProxyFactory {
private ProxyFactory() {
}
/**
*
* @param o
* @param handler 动态代理类的动态处理类
* @return
*/
public static Object getproxy(final Object o,final Handler handler) {
InvocationHandler objhandler = new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
handler.handbefore();
method.invoke(o, new Object[] {});
handler.handafter();
return null;
}
};
return Proxy.newProxyInstance(ProxyFactory.class.getClassLoader(), o
.getClass().getInterfaces(), objhandler);
}
}
下面是被代理对象接口
package Factory;
public interface Role {
public void sayHello();
}
下面是被被代理对象
package Factory;
public class RoleImpl implements Role {
@Override
public void sayHello() {
System.out.println("RoleImpl------->sayhello");
}
}
下面是被代理对象的接口
package Factory;
public interface Handler {
public void handbefore();
public void handafter();
}
下面是被代理对象1
package Factory;
public class FirstHandler implements Handler {
@Override
public void handbefore() {
System.out.println("this is my FirstHandler------->before");
}
@Override
public void handafter() {
System.out.println("this is my FirstHandler------->after");
}
}
下面是被代理对象2
package Factory;
public class SecondHandler implements Handler {
@Override
public void handbefore() {
System.out.println("this is my SecondHandler------->before");
}
@Override
public void handafter() {
System.out.println("this is my SecondHandler------->after");
}
}
下面是测试类
package Factory;
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
Role role=new RoleImpl();
Handler handler1=new FirstHandler();
Handler handler2=new SecondHandler();
Role ro=(Role)ProxyFactory.getproxy(role, handler1);
ro.sayHello();
ro=(Role)ProxyFactory.getproxy(role, handler2);
ro.sayHello();
}
}
测试类打印的结果是
this is my FirstHandler------->before
RoleImpl------->sayhello
this is my FirstHandler------->after
this is my SecondHandler------->before
RoleImpl------->sayhello
this is my SecondHandler------->after
通过以上的实例,可以轻松的生成任意动态代理对象,并融入自己的处理类,方便实现自己的业务逻辑!!!

- 大小: 6.1 KB
分享到:
相关推荐
**Nginx实战进阶——负载均衡策略详解** 在现代Web服务中,Nginx作为一款高性能的HTTP和反向代理服务器,广泛应用于网站的负载均衡配置中。它能够有效地分发请求到多个后端服务器,提高系统的可用性和响应速度。本...
进阶学习应包括动态映射、自定义映射、字段分析器的设定以及多类型映射的理解。 3. **数据导入与更新**:使用`_bulk` API进行批量索引,可以提高数据导入效率。同时,了解如何使用`update` API和`_index` API对已...
* Nginx 是一款高性能的 HTTP 和反向代理服务器,一般部署在 Linux 服务器上,本书介绍在 windows 10 上部署方式。 * Nginx 的下载地址是 http://nginx.org/en/download.html,一般做开发不选择最新版,而是选择最...
4. 动态代理:Java的Proxy和InvocationHandler可以实现动态生成代理类,用于拦截方法调用,实现AOP(面向切面编程)。 其次,Java高级学习还包括对JVM(Java虚拟机)的深入探究,包括JVM内存模型、类加载机制、性能...
4. **反射**:Java反射机制允许在运行时动态地获取类的信息并操作类的对象,这对于插件化开发、序列化和动态代理等场景非常有用。 5. **设计模式**:设计模式是解决常见软件设计问题的最佳实践,如单例模式、工厂...
4. **Mapper的动态代理**:分析MyBatis是如何通过动态代理技术实现Mapper接口的调用。 5. **MyBatis与Spring的整合**:介绍如何在Spring框架中配置MyBatis,以及如何使用Spring的@Autowired和@Scope注解。 6. **...
进阶篇;架构篇;模块篇几个阶段学习,每个阶段的内容个侧重点不同,如nignx指令,nginx配置;nginx服务集成;nginx集群,负载均衡,反向代理,Lua等等。 2,Nginx案例:学习Nginx离不开案例,需要动手配置,测试。...
本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载使用,也适合小白学习进阶, 或者实际项目借鉴参考! 当然也可作为毕设项目、课程设计、作业、项目初期...
- **IP代理**:为了避免频繁访问同一网站导致IP被封,可以使用代理IP池。 - **User-Agent设置**:模拟不同浏览器或设备发送请求,降低被识别为爬虫的风险。 - **爬虫速率控制**:设置延迟以避免过于频繁的请求,...
五、JMeter进阶技巧 1. **分布式测试**:JMeter支持分布式测试,可以将多台机器配置为代理服务器,共同发送请求,以模拟更大规模的并发用户。 2. **自定义插件与扩展**:JMeter有丰富的第三方插件库,可以扩展其功能...
JavaWeb面试题是针对Java开发人员在求职过程中经常会遇到的一类问题,这些问题涵盖了JavaWeb的基础、进阶以及实际应用等多个方面。以下是一些常见的JavaWeb面试知识点,它们可以帮助你更好地准备面试,提升自己的...
作为一个大三学生的学习资源,它可能包括了基础知识讲解,以及逐步进阶的内容,帮助读者理解设计模式的核心理念和实际应用。 单例模式是一种保证一个类只有一个实例的模式,常用于配置管理、缓存等场景。工厂模式则...
RabbitMQ是一个开源的消息代理和队列服务器,它在分布式系统中广泛用于处理异步任务和消息传递。在这个“RabbitMQ_Test.rar”压缩包中,我们很可能会找到一个简单的C#应用程序,该程序展示了如何与RabbitMQ进行交互...