java中的动态代理
来源:互联网 发布:linux命令试题 编辑:程序博客网 时间:2024/05/16 10:50
Java在JDK1.3之后加入了可协助开发动态代理功能的API.使用动态代理,可以使一个处理者(代理)服务于各个对象。创建一个动态代理类只需实现java.lang.reflect.InvocationHandler接口。
下面创建一个处理日志的动态代理类LogHandler去代理HelloSpeaker类
首先创建HelloSpeaker的接口
package com.test;
public interface IHello {
public void sayHello(String name);
}
然后创建HelloSeaker
package com.test;
public class HelloSpeaker implements IHello {
public void sayHello(String name) {
System.out.println("hello:"+name);
}
}
最后创建LogHandler类
package com.test;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.logging.Logger;
public class LogHandler implements InvocationHandler {
private Logger logger = Logger.getLogger(this.getClass().getName());
private Object delegate;
public Object bind(Object delegate) {
this.delegate = delegate;
return Proxy.newProxyInstance(delegate.getClass().getClassLoader(),
delegate.getClass().getInterfaces(), this);
}
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Object result = null;
try {
logger.info("method start..." + method);
result = method.invoke(delegate, args);
logger.info("method end..." + method);
} catch (Exception e) {
logger.info(e.getMessage());
}
return result;
}
}
好了,现在我们编写一个测试类Demo
package com.test;
public class Demo {
public Demo() {
// TODO Auto-generated constructor stub
}
/**
* @param args
*/
public static void main(String[] args) {
LogHandler logHandler = new LogHandler();
IHello hello = (IHello)logHandler.bind(new HelloSpeaker());
hello.sayHello("cat");
}
}
运行一下结果为:
hello:cat
2010-3-1 17:38:21 com.test.LogHandler invoke
信息: method start...public abstract void com.test.IHello.sayHello(java.lang.String)
2010-3-1 17:38:21 com.test.LogHandler invoke
信息: method end...public abstract void com.test.IHello.sayHello(java.lang.String)
说明:
LogHandle的Proxy.newProxyInstance()静态方法建立一个代理对象,建立代理对象必须告知所要代理的接口,之后可以操作所建立的代理对象。在每次操作时都会执行InvocationHandler的invoke方法,invoke()方法会传入被代理对象的方法名称与执行参数,实际上要执行的方法会交由method.invoke(),在method.invoke()前后加上日志的动作,method.invoke()传回的对象是实际方法执行过后的回传结果。
- java中的动态代理
- java中的动态代理》》》》》
- JAVA 中的 动态代理
- java中的动态代理
- java中的动态代理
- Java中的动态代理
- Java中的动态代理
- JAVA中的动态代理
- java中的动态代理
- java中的动态代理
- java 中的动态代理
- Java中的动态代理
- java中的动态代理
- Java中的动态代理
- java中的动态代理
- java中的动态代理
- java中的动态代理
- Java中的动态代理
- Linux CentOS安装中文输入法
- 基于Annotation的Struts2.0+Hibernate3.3+Spring2.5整合开发 (1)
- C#将数据库里中的数据导到excel中
- Python编码规范
- Java]JAVA获取相对路径问题的解决
- java中的动态代理
- ShellExecute()用法以及和system()的区别
- .Net经典推荐面试题及答案
- 3月1日数平项目系统移植问题记录!
- 中超16强内援转会更新 陕西重金打造中国银河战舰
- 今天 AW 机考
- 用JAVA做一个便宜好用的二维码扫描器
- 搭建电脑端PYS60软件开发平台
- SLA 服务等级协议