第一,当具体工厂类产生一个类时,首先要对该类进行装载,任何java程序都要运行在java虚拟机上,当二进制的类型数据被导入到java虚拟机中时,虚拟机将会进行验证、准备和解析及初始化各项工作。装载是把二进制形成的java类型读入java虚拟机、验证、准备和解析统称。其中验证是确认类型符合java语言的语义,并且它不会危及虚拟机的完整性。准备是java虚拟机为类变量分配的内存。设置默认初始值,但在到达初始化阶段之前,类变量都没有初始化为真正的初始值,解析是在类型的变量池中寻找类,接口,字段和方法的符号引用。把这些符号引用替换成直接引用的过程。为了准备让一个类或者接口被首次主动使用。最后一个步骤就初始化,也就是为类变量赋予程序员希望这个类变量所具备的初始值。可以说,到此为止,这一步,具体工厂类产生的类已经彻底转变成java虚拟机上的一分子,它的所有方法,属性等都已经成为了一个不可分割的整体第二,当开始运行时,每个java程序都有自己的堆空间,它们不会彼此干扰。对于堆的存在,这是由虚拟机自行决定,在这里会出现以下问题:如果系统关闭或重起,那么实例就会消失,所以在这里,对于经常需要的,可将一部分实例放在一个缓冲池里,根据队列来决定调用次序,对于不经常需要的,可将另一部分实例通过用户类自定义加载器加载,在容器加载前应将二进制的类型数据分类保存在一个“地方”,以后用户类自定义加载器根据相关列表加载保存的二进制的类型数据,这样可以保证关系不被破坏,又可确保效率,我在这里借鉴了Java在动态扩展上的思想;第三,当一个程序如果发生变化时,在同一个类中,与它协作的类将不断地变化,但是,回到“第一这个大问题”,我们可以看到,它们都已经彻底转变成java虚拟机上的一分子,不存在着A类实例原先需要B类实例协调,B类实例需要C类实例协调,现在B类实例由C类实例协调了,程序因为找不到原有关系而不能运行的情况,也就是说,只要需要的实例都存在,就不会发生以上问题;第四,一个类可以产生多个对象,每一个对象只调用与它相关的模块,一个对象对应一个地址。不同线程执行同一个方法时,会把同一个对象解析成该线程对象的实例变量。

解决方案 »

  1.   

    如果你要避免这样,那你就应该把类设成 final型
      

  2.   

    “不存在着A类实例原先需要B类实例协调,B类实例需要C类实例协调,现在B类实例由C类实例协调了,程序因为找不到原有关系而不能运行的情况”,这是我的意思
      

  3.   

    技术手册一、实现目的    实现随需即变的业务系统。二、实现手段一).总体构想    总体采取抽象工厂模式,借鉴了Java在动态扩展上的技术,以中间件平台为中心,以XML文件为纽带,将不同模块有机地连接起来。二).实施策略1.实现一个“搜索定义XML配置文件”业务,在其中查找相关搜索规则,并将找到相关类型名保存在一个参数里;      在这里,中间件平台将首先找到搜索定义所在的“搜索定义XML配置文件”中的位置,然后根据“搜索定义XML配置文件”在“类定义XML配置文件”中查找相关类,最后将结果一一保存在集合里。2.实现一个保存查找相关搜索规则结果到集合中的具体产品类业务;    具体产品类模块实现产品接口,这个接口规定了所有类必须是集合类;容器将类型参数传到具体工厂类模块后,具体工厂类模块立刻对具体产品类模块进行实例化。3.实现一个得到具体实例的具体工厂类业务;    具体工厂类模块实现抽象工厂类,这个抽象类规定了所有工厂类必须有newIntance()方法,并且“如果是用户自定义类装载器,则调用defineClass方法得到相关实例,如果定义类型的字节是由用户自定义的类装载器确定或者生成的,则调用defineClass方法得到相关实例,如果用户自定义的类装载器通过调用findSystemClass方法调用委派启动类来装载,findSystemClass方法会在这个时候返回相关实例”。4.实现一个对实例进行筛选和排队的缓冲池类业务    实现接口;设计该模块是这样考虑的,在这里,一般会出现这种情况,例如,A类实例由B类实例协作,B类实例由C类实例协作,现在B类实例改由D类实例协作,则意味着原有B类实例的消失,那么,A类实例很可能就编译不过,如何解决这个问题呢?用容器将所有产生的实例保存起来?这样做似乎也可以,但是,随着实例的越来越多,容器很可能会爆满,如果是需要时在加载,则会造成时间的延迟,所以,必须从时间和空间两个方面来考虑这个问题:在这一步,将借鉴Java的动态扩展技术,******5.实现一个保存没被缓冲池类保存的实例的类型信息业务    实现接口;设计该模块是为了达到时间与空间的和谐搭配,因为仅仅注意时间,让所有类都放在一个缓冲池类里将很可能造成缓冲池爆满,而仅仅注意空间又会造成时间的延迟,所以,在这里采取分流策略,调用次数少的将放在这里。6.实现一个保存消息的业务    实现接口;设计该模块是这样考虑的,在这里,如果掌上设备类需要首先调用市场类得到金额数据,而后将该数据传到利率类中去计算,最后,将利率类计算的结果返回,那么,就必须向中间经过的市场类和利率类指定参数来源三).所用的XML配置文件1.类定义XML配置文件2.搜索定义XML配置文件3.方法定义XML配置文件
      

  4.   

    我的页面是result.jsp 
    <s:set name="error" value="#test" /> 
    <s:if test="#error==null"> 
                <jsp:forward page="result.action"> </jsp:forward> 
    </s:if> 
    错误:找不到result.action 
    HTTP Status 404 - /struts/result.action 
    /struts/result.action 
    The requested resource (/struts/result.action) is not available. 
    可是,我用下面的地址直接访问确成功了。不明白了,道低是怎么回事啊。 
    http://localhost:8080/struts/result.action 后来我发现:用 <jsp:forward>地址栏里还是http://localhost:8080/struts/result.jsp 
    可能问题出在这里了, <jsp:forward>跳转页面地址不变 但现在我想实现 我想要的功能,用拦截器好像不太好使,所以真的想不好的办法了烦死了。
    帮忙想个办法吧。
      

  5.   

    流程首先,根据搜索条件得到相关的类型,也就是与当前类协作的类型,这作为具体产品类;然后,如果是用户自定义类装载器,则调用defineClass方法得到相关实例,如果定义类型的字节是由用户自定义的类装载器确定或者生成的,则调用defineClass方法得到相关实例,如果用户自定义的类装载器通过调用findSystemClass方法调用委派启动类来装载,findSystemClass方法会在这个时候返回相关实例,这作为具体工厂类;最后,由容器将实例返回给当前类。在这里,一般会出现这种情况,例如,A类实例由B类实例协作,B类实例由C类实例协作,现在B类实例改由D类实例协作,则意味着原有B类实例的消失,那么,A类实例很可能就编译不过,如何解决这个问题呢?用容器将所有产生的实例保存起来?这样做似乎也可以,但是,随着实例的越来越多,容器很可能会爆满,如果是需要时在加载,则会造成时间的延迟,所以,必须从时间和空间两个方面来考虑这个问题:当得到关联类类名后,首先将它传到用户自定义类加载器的loadClass()方法的className参数中,在这里,它将产生一个类型,然后将这个类型传到loadClass()方法的String name参数中,产生该类型的实例,最后由工厂类将实例返回给最终用户;