动态代理的核心是InvocationHandler接口,要使用动态代理就必须实现该接口。这个接口的委派任务是在invoke(Object proxy, Method m, Object[] args)方法里面实现的:
//在调用核心功能之前作一些动作
……
//调用核心功能
m.invoke(obj, args);
//在调用核心功能以后做一些动作
……
我们可以看到动态代理其实用的是反射机制来调用核心功能的:m.invoke(obj, args);正是这种反射机制的使用使得我们调用核心功能更加灵活,而不用依赖于某一个具体的接口,而是依赖于Object对象。
下面我们来具体看看动态代理或动态委派如何使用:
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
interface DoAction{
public void ViewAction();
public void AddAction();
}
class DoActionImpl implements DoAction {
public void ViewAction(){
System.out.println("查看信息!");
}
public void AddAction(){
System.out.println("添加信息!");
}
}
class ProxyAction implements InvocationHandler {
private Object action;
private User user = new User() ;
public ProxyAction(Object action) {
this.action = action;
}
public static Object getInstance(Object action) {
return Proxy.newProxyInstance(action.getClass().getClassLoader(),
action.getClass().getInterfaces(), new ProxyAction(action));
}
public Object invoke(Object proxy, Method m, Object[] args)
throws Throwable {
Object result = null;
try {
// 在委派之前作动作,如权限判断等
if(user.getPermission().equals(m.getName())){
}else{//没权限,不执行委派
return result;
}
// 进行委派
result = m.invoke(action, args);
} catch (InvocationTargetException e) {
throw e.getTargetException();
} catch (Exception e) {
throw new RuntimeException("unexpected invocation exception: "
+ e.getMessage());
} finally {
// 在委派之后做动作
}
return result;
}
}
//用户信息
class User{
private String permission = "ViewAction" ;
public String getPermission() {
return permission;
}
public void setPermission(String permission) {
this.permission = permission;
}
}
public class proxy {
public static void main(String[] args) {
DoAction action =(DoAction) ProxyAction.getInstance(new DoActionImpl());
action.ViewAction();
}
}
这个代理类,首先是实现了InvocationHandler接口;然后在getInstance()方法里得到了代理类的实例;在invoke()方法里实现代理功能,也很简单。
下面我们来看客户端:
Action action = (Action)ProxyAction.getInstance(new ViewAction());
Action.doAction();
我们可以看到代理类对接口的依赖也转移到了客户端上,这样,代理类不依赖于某个接口。对于同样的代理类ProxyAction,我们也可以有如下的客户端调用:
Engine engine = (Engine)ProxyAction.getInstance(new EngineImpl());
Engine.execute();
只要engineImpl类实现了Engine接口,就可以像上面那样使用。
现在我们可以看到,动态代理的确是拥有相当的灵活性。
分享到:
相关推荐
以 Jive 为例,剖析代理模式在用户级别授权机制上的应用 设计模式之 Facade(门面?) 可扩展的使用 JDBC针对不同的数据库编程,Facade提供了一种灵活的实现. 设计模式之 Composite(组合) 就是将类用树形结构组合成...
结构型模式如适配器模式、装饰器模式、代理模式等,关注如何将不同的类或对象组合在一起,形成新的结构或功能。行为型模式如策略模式、观察者模式、职责链模式等,关注对象之间的交互和行为分配。 例如,工厂模式...
- **《萨克拉门托蜜蜂报》**:利用数据库识别出可能不再订阅的客户,通过电话沟通等方式挽留客户,显著提高了续订率。 - **《读卖新闻》**:不仅收集了丰富的读者数据,还将其应用于广告销售中,使得数据库营销成为...
同时,设计模式如工厂模式、单例模式、代理模式等的运用,提高了代码的可读性和可维护性。 六、安全性与性能优化 .NET框架提供了强大的安全机制,如身份验证、授权、加密等。在性能优化方面,可以利用缓存策略、...
wget支持HTTP、HTTPS和FTP协议,同时也能够处理重定向、通过代理服务器工作、断点续传以及在后台运行等特性。 在Windows系统中,wget.exe可能不作为内置工具提供,但可以通过安装第三方软件或者从GNU wget项目官网...
10. **断点续传**:当下载过程中断,可以使用`-c`选项继续之前的下载,节省带宽和时间。 11. **文件大小限制**:`--max-filesize`选项允许设定最大下载文件大小,防止意外下载过大的文件。 12. **日志与输出**:`-...
- **文件传输类**:提供PUT和GET方式的文件传输,支持断点续传。 - **音频传输类**:支持实时音频捕捉和传输,适用于两点对话和多点会议,包括发言控制、音量显示和录音功能。 - **视频传输类**:包括本地预览、...
6. **防火墙和代理支持**:对于那些需要通过防火墙或代理服务器访问FTP服务的情况,FlashFXP也能顺利应对。 7. **实时文件预览**:在上传前,用户可以查看远程服务器上的文件,确保正确无误。 8. **文件同步**:...
- 余胜军在简历中强调了对JavaSE基础知识的熟练掌握,包括面向对象分析和设计能力,熟悉各种设计模式,如代理、单例、工厂、建造者、观察者、策略、模版、装饰、门面等。 - 此外,他还精通Java中的反射、自定义...
- **数据分析**:运用数据分析工具,从大量数据中洞察客户需求模式。 - **定制化服务**:根据每个客户的具体情况,提供个性化解决方案。 总之,挖掘客户需求是一个综合性的过程,需要技术、沟通和策略的结合。...
实例117 代理服务器的实现 340 实例118 IP多点传送(基于UDP的C/S) 345 第14章 线程 350 实例119 启动和停止线程 350 实例120 多线程同步方法 352 实例121 取钱存钱(线程同步互斥) 354 实例122 谁唤醒了我...
- **断点续传**:使用`-C`选项可以实现下载的断点续传。 ``` curl -C - -o filename https://www.example.com/large-file ``` - **并发请求**:通过管道和`xargs`命令可以实现并发请求。 ``` urls=(url1 url2...
- **proxy ftp-cmd**:在代理服务器环境中使用,执行一个FTP命令,通常用于在需要代理的情况下打开连接。 - **put local-file [remote-file]**:上传本地文件到远程服务器。 - **pwd**:显示远程服务器当前所在的...
4. **异步操作**:使用libcurl的非阻塞模式,pycurl可以在单线程中并发处理多个请求,实现高效的多任务处理。 5. **SSL/TLS安全**:pycurl支持SSL和TLS加密,确保数据在传输过程中的安全性。 6. **代理服务器**:...
FlashFXP是一款功能强大的...通过本教程的学习,用户将能够熟练运用FlashFXP进行各种FTP操作,无论是日常的文件传输,还是专业的网站维护,都能游刃有余。请参照教程中的步骤,结合实际操作,逐步提升在FTP领域的技能。
方案中提出根据不同市场等级(一级、二级、三级市场)设定不同的合作模式,如区域代理、中心托管和品牌加盟。这样的多元化发展策略,能够帮助早教中心在不同地域和市场环境中快速适应并实现品牌扩张。 各岗位编制与...
8. **用户代理伪装**:有些网站可能需要特定的用户代理才能访问,`--user-agent`或`-U`参数可以帮助你伪装成其他浏览器: ``` wget --user-agent="Mozilla/5.0" [URL] ``` 9. **保存日志**:`wget`允许记录下载...
在本压缩包“xiazai.rar”中,包含的是一套简单的Java...通过研究这些代码,初学者可以了解到如何在实际项目中运用Java进行文件下载的程序设计,而有经验的开发者则可以借鉴其中的设计模式和技巧,提升自己的编程技能。
### 详解Linux中的wget命令 #### 一、简介 在Linux系统中,`wget`是一个极为重要的命令行工具,主要用于从互联网上下载文件。对于Linux用户来说,掌握`...在未来的工作中,灵活运用这些功能将大大提高您的工作效率。