Java的动态代理Word格式.docx
- 文档编号:20171566
- 上传时间:2023-01-17
- 格式:DOCX
- 页数:13
- 大小:19.17KB
Java的动态代理Word格式.docx
《Java的动态代理Word格式.docx》由会员分享,可在线阅读,更多相关《Java的动态代理Word格式.docx(13页珍藏版)》请在冰豆网上搜索。
doWork"
)){
System.out.println("
Iampreparingmywork!
"
);
result=arg1.invoke(originalObject,arg2);
}else{
Iampreparingtheotherthing!
returnresult;
}
接口类:
publicinterfaceWorker{
publicvoiddoWork();
publicvoidgetSalary();
实现类:
publicclassWorkerImplimplementsWorker{
publicWorkerImpl(){
Iamgettinginstance"
publicvoiddoWork(){
System.out.print("
Iamworking!
publicvoidgetSalary(){
IamgettingmySalary!
测试类
publicclassManager{
publicManager(){
publicstaticvoidmain(String[]args){
Workerworker=(Worker)AOPHandler.bind(newWorkerImpl());
worker.doWork();
worker.getSalary();
以上代码在JDK1.4.2下运行结果为:
Iamgettinginstance
Iampreparemywork!
Iampreparetheotherthing!
利用CGLIB工具包,可以对非接口实现类的动态代理
importnet.sf.cglib.proxy.Enhancer;
importnet.sf.cglib.proxy.MethodInterceptor;
importnet.sf.cglib.proxy.MethodProxy;
publicclassAOPAnotherimplementsMethodInterceptor{
privateEnhancerenhancer=newEnhancer();
publicAOPAnother(){
super();
/*(non-Javadoc)
*@seenet.sf.cglib.proxy.MethodInterceptor#intercept(java.lang.Object,java.lang.reflect.Method,java.lang.Object[],net.sf.cglib.proxy.MethodProxy)
*/
publicObjectintercept(Objectarg0,Methodarg1,Object[]arg2,
MethodProxyarg3)throwsThrowable{
Iamprepareingsomework!
before"
+arg1.getName());
Objectresult=arg3.invokeSuper(arg0,arg2);
returnnull;
publicObjectgetInstrumentedClass(Classclz){
enhancer.setSuperclass(clz);
enhancer.setCallback(this);
returnenhancer.create();
测试代码:
AOPAnotheraop=newAOPAnother();
Workerbob=(Worker)aop.getInstrumentedClass(WorkerImpl.class);
bob.doWork();
bob.getSalary();
测试在JDK1.4.2下运行结果:
beforedoWork
beforegetSalary
java动态代理机制
/*
*Createdon2005-6-3
*
*TODOTochangethetemplateforthisgeneratedfilegoto
*Window-Preferences-Java-CodeStyle-CodeTemplates
*/
importjava.util.List;
/**
*@authorCinda
*
*TODOTochangethetemplateforthisgeneratedtypecommentgotoWindow-
*Preferences-Java-CodeStyle-CodeTemplates
publicclassDelegateDemoimplementsInvocationHandler{
privateListl;
publicDelegateDemo(Listc){
l=c;
//c为要代理的对象
//截获代理对象上的方法调用,当调用方法为size时,进行改进让它按照你的想法去做,
//对其他的方法仍按原来的调用
publicObjectinvoke(Objectproxy,Methodmethod,Object[]args)
throwsThrowable{
if("
size"
.equals(method.getName())){
Display.pirnt();
returnnewInteger(10);
//不能为null,System.out.println(null)会出错!
!
}else{
returnmethod.invoke(l,args);
classDisplay{
publicstaticvoidpirnt(){
methodsizeinvoked!
!
测试的类
importjava.lang.reflect.*;
importjava.util.*;
publicclassTest{
publicstaticvoidmain(String[]args){
//取得类型装载器,只有同样的类型装载器装载的类才能相互访问,
//所以用装载被代理类的类装载器来装载代理类,使它们在相同的命名空间,
//newClass[]{List.class}代理类实现的接口
//newDelegateDemo(newArrayList())调用被分派的对象
Listl=(List)Proxy.newProxyInstance(List.class.getClassLoader(),
newClass[]{List.class},newDelegateDemo(newArrayList()));
String[]s=newString[]{"
abc"
"
cbs"
ss"
ww"
kdjfk"
};
for(inti=0;
i<
s.length;
i++){
l.add(s[i]);
l.size=="
+l.size());
动态代理和nanningAOP-3
关键字:
AOPNanningDynamicproxyAOP动态代理
Interception,是AOP的特点之一,但是Interception这个名次并不是和AOP的概念一同产生的。
顾名思义,Interception就是拦截。
本系列的第一篇文章使用java1.3提供的动态代理功能实现了一个Interception的例子,演示了在某个方法执行前和执行后进行了拦截(Interception)。
本文我们用nanningAOP来实现同样的功能。
注意AOP中的Interception和普通概念的interception是不同的。
我们最后再讨论这个问题。
代码如下:
packagetcftest;
importcom.tirsen.nanning.AspectInstance;
importcom.tirsen.nanning.Aspects;
importcom.tirsen.nanning.Intf;
importcom.tirsen.nanning.IntfImpl;
importcom.tirsen.nanning.MixinInstance;
importcom.tirsen.nanning.NullInterceptor;
publicclasstcftest{
publictcftest(){
AspectInstanceaspectInstance=newAspectInstance();
MixinInstancemixinInstance=newMixinInstance();
mixinInstance.setInterfaceClass(Intf.class);
mixinInstance.setTarget(newIntfImpl());
mixinInstance.addInterceptor(newNullInterceptor());
aspectInstance.addMixin(mixinInstance);
ObjectbigMomma=aspectInstance.getProxy();
Intfintf=(Intf)bigMomma;
intf.call();
消息拦截接口如下:
packagecom.tirsen.nanning;
importcom.tirsen.nanning.definition.SingletonInterceptor;
publicclassNullInterceptorimplementsMethodInterceptor,SingletonInterceptor{
publicNullInterceptor(){
publicObjectinvoke(Invocationinvocation)throwsThrowable{
System.out.println("
tcf:
beforcallme,right?
"
returninvocation.invokeNext();
输出结果如下:
call()
关于:
Intf.class
IntfImpl.class
类的代码可以参考上文实现,因为很简单,就不贴出来了。
NullInterceptor.java的代码,可以在nanning提供的测试包中找到。
我在其中加入了:
另外:
EclipseM8的中文问题我还没有解决,谁知道的话请告诉我,谢谢。
注意上面代码的蓝色代码:
可以看到:
intf.call()在这个方法执行之前打印了我们预期的结果,成功地实现了消息的拦截。
这个效果和本系列的第一篇文章介绍的java动态代理实现的效果一样。
现在是时候介绍用java动态代理和nanning实现Interception的不同。
AOP中的Interception是允许动态指定的,这个动态指定的点就是pointcut。
相信熟悉aop的读者对pointcut都了解。
而普通的Interception就不能这样了,是固定写在java程序中。
当然如果你通过设计模式,配置文件等可以让Interception动态指定的话,那你也基本作了一个AOP的Interception。
这就是Nanning已经作的工作。
下文我们分析nanningAOP的实现原理。
动态代理实践的学习笔记
一:
动态代理实践
1.接口类:
Foo.java
packagedymaticproxy;
*<
p>
Title:
高层提供的服务接口<
/p>
Description:
<
Copyright:
Copyright(c)2004<
Company:
huawei<
*@authorzhaolh
*@version1.0
publicinterfaceFoo{
voiddoAction();
2.接口的实现1
高层提供服务接口的具体实现<
publicclassFooImplimplementsFoo{
publicFooImpl(){
publicvoiddoAction(){
/**@todoImplementthisdymaticproxy.Foomethod*/
//thrownewjava.lang.UnsupportedOperationException("
MethoddoAction()notyetimplemented."
inFooImp1.doAction()"
3.接口的实现2
publicclassFooImpl2implementsFoo{
publicFooImpl2(){
inFooImp2.doAction()"
4.处理器类
动态代理类的调用处理器<
publicclassCommonInvocationHandlerimplementsInvocationHandler{
//动态执行对象,需要回调的对象
privateObjecttarget;
//支持构造子注射
publicCommonInvocationHandler(){
publicCommonInvocationHandler(Objecttarget){
setTarget(target);
/**
*采用setter方法注射
*@paramtarget
publicvoidsetTarget(Objecttarget)
{
this.target=target;
*调用proxy中指定的方法method,并传入参数列表args
*@paramproxy代理类的类型,例如定义对应method的代理接口
*@parammethod被代理的方法
*@paramargs调用被代理方法的参数
*@return
*@throwsjava.lang.Throwable
publicObjectinvoke(Objectproxy,Methodmethod,Object[]args)throwsThrowable{
/**@todoImplementthisjava.lang.reflect.InvocationHandlermethod*/
Methodinvoke()notyetimplemented."
returnmethod.invoke(target,args);
5.动态代理示范程序
T
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Java 动态 代理
![提示](https://static.bdocx.com/images/bang_tan.gif)