为了方便以后再次浏览,现在摘录一些东西。

文章来自“ibm developerworks”地址:http://www-128.ibm.com/developerworks/cn/java/l-struts-reflect/

ActionForm是一个很重要的概念,它的主要功能就是为Action的操作提供与客户表单相映射的数据(如果在客户指定的情况下,还包括对数据进行校验)。Action根据业务逻辑的需要,对数据状态进行修改,在改变系统状态后,ActionForm则自动的回写新的数据状态并保持。

正如Entity EJB对J2EE的重大贡献一样,Entity EJB使得程序员对二维关系数据库的存取对象化了,程序员可以使用Set 或者Get等面向对象的方法来操纵关系数据库的数据,而ActionForm也使得程序员对网页的数据存取奇迹般的对象化了,程序员同样也可以使用Set 或者Get等面向对象的方法存取网页上的数据,这是一个开发模式方式上的重大转变。基于此,我个人认为ActionForm与JSP即VIEW层的关系最好是一对一的关系,这样,在理解上会更清晰一些。但是,这样也会带来一个很现实的问题,在一个应用程序中,也许有非常多得JSP页面,如果每个ActionForm 都只对应一个JSP页面,那么系统的Java代码就会急剧膨胀起来,而且,每个ActionForm都是只有很简单的Set或者Get方法存取数据,那么,如何简化Struts应用程序的开发呢?

在Struts1.1 中,Struts引入了DynaActionForm和Dyna Bean,试图解决这个问题,在我看来,DynaActionForm的引入,破坏了对网页存取对象化的概念,使开发人员重新回到了使用HashTable、Map、Collection、ArrayList等集合对象来实现对数据进行存取的老路上来。虽然应用程序的灵活性大大增加了,但是代码的可读性也大大降低了,开发人员之间的交流难度也增加了。

此文章看了一半不太懂,以后在看。其中提到“放射机制”,应该先看看这个东西。

关于反射机制的一遍文章,地址:http://www.66study.com/Article/web/JSP/J2EE/200506/26832.html

自己的理解:
         反射正如其名,使自己得到关于自身的信息,并可以更改。(它是java的特征之一)java具有反射机制,是因为有java.lang.reflection包,更深的说是在jvm上的运行方式不一样。(使用反射基本上是一种解释操作,我们可以告诉JVM,我们希望做什么并且它满足我们的要求。这类操作总是慢于只直接执行相同的操作。它允许程序创建和控制任何类的对象(根据安全性限制),无需提前硬编码目标类。这些特性使得反射特别适用于创建以非常普通的方式与对象协作的库。例如,反射经常在持续存储对象为数据库、XML或其它外部格式的框架中使用。Java reflection 非常有用,它使类和数据结构能按名称动态检索相关信息,并允许在运行着的程序中操作这些信息。Java 的这一特性非常强大,并且是其它一些常用语言,如 C、C++、Fortran 或者 Pascal 等都不具备的。

但反射有两个缺点。第一个是性能问题。用于字段和方法接入时反射要远慢于直接代码。性能问题的程度取决于程序中是如何使用反射的。如果它作为程序运行中相对很少涉及的部分,缓慢的性能将不会是一个问题。即使测试中最坏情况下的计时图显示的反射操作只耗用几微秒。仅反射在性能关键的应用的核心逻辑中使用时性能问题才变得至关重要。
许多应用中更严重的一个缺点是使用反射会模糊程序内部实际要发生的事情。程序人员希望在源代码中看到程序的逻辑,反射等绕过了源代码的技术()会带来维护问题。反射代码比相应的直接代码更复杂,正如性能比较的代码实例中看到的一样。解决这些问题的最佳方案是保守(谨慎)地使用反射——仅在它可以真正增加灵活性的地方——记录其在目标类中的使用。

下面这个例子:既然能用直接代码实现,有何必用reflection。仔细考虑,两者有不同之处,直接代码只能访问被声明为例如public的,而reflection的功能更强。即使被声明为private也可以被访问。(当具体还是不太明白reflection是怎么用的,有何用。)

(还得参考些东西,一个现成的用reflection的例子,就是struts,在看struts时,可以在研究一下reflection。)


public int accessReference(int loops) {
    TimingClass timing 
= new TimingClass();
    
for (int index = 0; index < loops; index++{
        timing.m_value 
= (timing.m_value + ADDITIVE_VALUE) *
            MULTIPLIER_VALUE;
    }

    
return timing.m_value;
}

 
public int accessReflection(int loops) throws Exception {
    TimingClass timing 
= new TimingClass();
    
try {
        Field field 
= TimingClass.class.
            getDeclaredField(
"m_value");
        
for (int index = 0; index < loops; index++{
            
int value = (field.getInt(timing) +
                ADDITIVE_VALUE) 
* MULTIPLIER_VALUE;
            field.setInt(timing, value);
        }

        
return timing.m_value;
    }
 catch (Exception ex) {
        System.
out.println("Error using reflection");
        
throw ex;
    }

}


利用反射实现类的动态加载









只有注册用户登录后才能发表评论。


网站导航:
 

posts - 9, comments - 1, trackbacks - 0, articles - 0

Copyright © ShQ