Tucany SCA软件架构设计理念分析之二_Oracle数据库_黑客防线网安服务器维护基地--Powered by WWW.RONGSEN.COM.CN

Tucany SCA软件架构设计理念分析之二

作者:黑客防线网安Oracle维护基地 来源:黑客防线网安Oracle维护基地 浏览次数:0

本篇关键词:Oracle数据库Oracle教程
黑客防线网安网讯:  1. 概述  上一篇文章主要讲述了Tuscany SCA的插件板模式及工厂模式的发展和提升,本文主要介绍Tuscany SCA开源软件中动态代理模式(Dynamic Proxy)及方法调用Invocation 。在使用Tus...

  1. 概述

  上一篇文章主要讲述了Tuscany SCA的插件板模式及工厂模式的发展和提升本文主要介绍Tuscany SCA开源软件中动态代理模式(Dynamic Proxy)及方法调用Invocation 在使用Tuscany SCA中我们只需要写接口及实现类,这些接口和实现类就是普通的java代码,并没有特殊之处Tuscany SCA会根据“.composite”文件把这些信息组装成Compoiste,至于如何组装,则是Tuscany SCA的Assembly模块的主要内容,我以后会介绍,但现在的问题是,如何来实现调用这些类的方法的问题,因为当调用的时候,外部接口是Tuscany SCA的Domain,Domain依赖的Runtime中就加载有Composite的内容,客户的逻辑在应用程序(即interface, implementClass),但这些都被组装进入了Composite中,所以要使用动态代理模式来实现,使得侵入性最小。

  2. Java动态代理基础知识

  Java动态代理类位于Java.lang.reflect包下,一般主要涉及到以下两个类:InvocationHandler和Proxy。

  InvocationHandler必须被实现,实现这个接口的invoke(Object obj,Method method, Object[] args),第一个参数obj一般是指代理类,method是被代理的方法, args为该方法的参数数组。这个invoke方法的内容主要是在调用被代理的方法前后方便地加上你自己的逻辑,如下例子

public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
 System.out.println(“调用前你要插入的逻辑,如验证权限”);

 //实际调用被代理类的方法

 Object result = method.invoke(this.target,args);
 System.out.println(“调用后你要插入的逻辑,如调整系统状态”);

 return result;
}

  Proxy:该类即为动态代理类,是Jdk实现的类,你无须实现,只使用就行其中主要包含以下内容:

Proxy.newProxyInstance(ClassLoader,cls. Interfaces[],InvocationHandler)

  其中ClassLoader是加载类,Inerface数组表示要代理的类的所有接口,InvocationHandler即上面介绍的具体实现类。通过这个方法就可以获取动态代理类Proxy,其实例是$proxy。如下例子表示如何使用动态代理:

PersonImpl person = new PersonImpl(); //在这里指定被代理类
InvocationHandler ds = new DynamicSubject(person); //初始化代理类
Class cls = person.getClass();
Person person1=Person.class.
cast(Proxy.newProxyInstance(cls.getClassLoader(),cls.getInterfaces(),ds));
person1.getName();

  上面的person1就是proxy对象,即动态代理,所谓Dynamic Proxy是这样一种class:它是在运行时生成的class,在生成它时你必须提供一组interface给它,然后该class就宣称它实现了这些interface。你当然可以把该class的实例当作这些interface中的任何一个来用。当然啦,这个Dynamic Proxy其实就是一个Proxy,它不会替你作实质性的工作,在生成它的实例时你必须提供一个handler,由它接管实际的工作。

  另外动态生成proxy类有以下限制:接口数组中的每个元素应代表接口,不能表示类,或原始类型,不能出现重复的类型,接口可以通过名称访问到,两个接口不能存在方法名与参数列表相同但返回值不同的情况,最大数为65535。动态代理只能够对interfaces进行动态的代理, 也就是说它先找出需要代理的对象实现的所有的interface, 然后只对所有的这些interface的所有的方法代理,对象除了interfaces以外的方法不予处理。这就是说我们再做contribution时,只要可以被外部调用的方法,都必须在接口中声明。

    黑客防线网安服务器维护方案本篇连接:http://www.rongsen.com.cn/show-13184-1.html
网站维护教程更新时间:2012-03-23 00:51:35  【打印此页】  【关闭
我要申请本站N点 | 黑客防线官网 |  
专业服务器维护及网站维护手工安全搭建环境,网站安全加固服务。黑客防线网安服务器维护基地招商进行中!QQ:29769479

footer  footer  footer  footer