动态代理的核心是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用户来说,掌握`...在未来的工作中,灵活运用这些功能将大大提高您的工作效率。