您的位置:首页 > 编程语言 > Java开发

使用Spring Introducation 让Java类实现动态语言特性

2007-10-10 16:14 906 查看
当我们没有一个实现类源代码以致不能为实现类增加新的方法时,我们在java语言中往往是无法实现的,但动态语言比(如JS),对动态对象增加可操作的方法是很容易得,我们借助Spring的Introduction这个特殊的advise,同样可以实现动态语言的这个特性



原始的业务接口及实现




package Introduction;






public interface ISome ...{


public void doSome();




}






package Introduction;






public class Some implements ISome ...{






public void doSome() ...{


System.out.println("原来的方法");


}




}





我们新增的业务接口和实现,其中实现类同时实现了业务接口和Spring Introduction接口




package Introduction;






public interface IOther ...{


public void doOther();




}










package Introduction;






import org.aopalliance.intercept.MethodInvocation;


import org.springframework.aop.IntroductionInterceptor;






public class Other implements IOther, IntroductionInterceptor ...{






public void doOther() ...{


System.out.println("增加的职责");


}






public Object invoke(MethodInvocation methodInvocation) throws Throwable ...{




if(implementsInterface(methodInvocation.getMethod().getDeclaringClass()))...{


return methodInvocation.getMethod().invoke(this, methodInvocation.getArguments());




}else...{


return methodInvocation.proceed();


}




}


//判断是否来自与IOther接口的方法调用




public boolean implementsInterface(Class clazz) ...{


return clazz.isAssignableFrom(IOther.class);


}




}





配置文件:




<?xml version="1.0" encoding="UTF-8"?>


<beans


xmlns="http://www.springframework.org/schema/beans"


xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"


xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">





<bean id="some" class="Introduction.Some"/>


<bean id="other" class="Introduction.Other"/>




<bean id="otherAdvisor" class="org.springframework.aop.support.DefaultIntroductionAdvisor">


<constructor-arg ref="other"></constructor-arg>


<constructor-arg value="Introduction.IOther"></constructor-arg>


</bean>




<bean id="proxyFactoryBean" class="org.springframework.aop.framework.ProxyFactoryBean">




<property name="proxyInterfaces" value="Introduction.ISome"></property>


<property name="target" ref="some"></property>


<property name="interceptorNames">


<list>


<value>otherAdvisor</value>


</list>


</property>


</bean>




</beans>



测试代码:




package Introduction;




import org.springframework.context.ApplicationContext;


import org.springframework.context.support.ClassPathXmlApplicationContext;






public class TestSpring...{




public static void main(String args[]) throws Exception...{





ApplicationContext ctx=new ClassPathXmlApplicationContext("Introduction/applicationContext.xml");





ISome some=(ISome)ctx.getBean("proxyFactoryBean");





some.doSome();//执行原来的方法


System.out.println("------------------");


((IOther)some).doOther(); //执行新增的方法


}


}





测试结果:

原来的方法
------------------
增加的职责
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐