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

原创 2007年10月10日 16:14:00

当我们没有一个实现类源代码以致不能为实现类增加新的方法时,我们在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(); 
//执行新增的方法
  }

}

 

测试结果:

原来的方法
------------------
增加的职责

jdk7 新特性-Java语言的动态性-脚本语言支持api-方法调用05

package org.yla.java语言的动态性.方法的调用05; import javax.script.Invocable; import javax.script.ScriptEngine...
  • huo_chai_gun
  • huo_chai_gun
  • 2014年11月20日 15:05
  • 896

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

当我们没有一个实现类源代码以致不能为实现类增加新的方法时,我们在java语言中往往是无法实现的,但动态语言比(如JS),对动态对象增加可操作的方法是很容易得,我们借助Spring的Introducti...
  • daryl715
  • daryl715
  • 2007年10月10日 16:14
  • 727

Spring之Java配置实现

1、引入spring相关的jar 2、写一个测试接口 public interface CompactDisc { void play(); void playDev(); ...
  • adolph_jun
  • adolph_jun
  • 2018年02月05日 17:25
  • 9

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

当我们没有一个实现类源代码以致不能为实现类增加新的方法时,我们在java语言中往往是无法实现的,但动态语言比(如JS),对动态对象增加可操作的方法是很容易得,我们借助Spring的Introducti...
  • likun557
  • likun557
  • 2013年02月01日 23:22
  • 231

java的语言特性

java语言特性  1、简单性:  2、面向对象:  3、分布式: 4、健壮性: 5、安全性:  6、可移植性:...
  • baiye_xing
  • baiye_xing
  • 2016年12月18日 23:01
  • 473

Spring - Java/J2EE Application Framework 应用框架 第 5 章 Spring AOP: Spring之面向方面编程G

第 5 章 Spring AOP: Spring之面向方面编程 5.1. 概念 面向方面编程 (AOP) 提供从另一个角度来考虑程序结构以完善面向对象编程(OOP)。 面向对象将应用...
  • GarfieldEr007
  • GarfieldEr007
  • 2017年02月16日 23:17
  • 159

Spring - Java/J2EE Application Framework 应用框架 第 5 章 Spring AOP: Spring之面向方面编程

第 5 章 Spring AOP: Spring之面向方面编程 5.1. 概念 面向方面编程 (AOP) 提供从另一个角度来考虑程序结构以完善面向对象编程(OO...
  • GarfieldEr007
  • GarfieldEr007
  • 2017年02月15日 23:08
  • 345

Scala中的语言特性是如何实现的(3) -- Trait

我的新博客地址:http://cuipengfei.me/blog/2013/10/13/scala-trait/ 我在Coursera上跟了一门叫做Functional Progr...
  • cuipengfei1
  • cuipengfei1
  • 2013年12月21日 13:09
  • 3764

使用spring的动态路由实现数据库读写分离【数据库读写分离(二) 】

使用spring的动态路由实现数据库读写分离 Spring2.0.1以后的版本已经支持配置多数据源,并且可以在运行的时候动态加载不同的数据源。通过继承AbstractRoutingDataSou...
  • chenhaiyang_ok
  • chenhaiyang_ok
  • 2012年09月11日 08:42
  • 2136

Springmvc+hibernate+spring简单实例实现(个人编译通过)

自己花了两天时间去网上查找了相关资料,搭建的一个综合springmvc、hibernate和spring三种框架类型的环境,进行了一些简单的实例实践,下面贴出搭建步骤和代码,方便大家交流学习,也方便日...
  • AlbenXie
  • AlbenXie
  • 2017年07月06日 17:44
  • 448
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:使用Spring Introducation 让Java类实现动态语言特性
举报原因:
原因补充:

(最多只允许输入30个字)