Java框架基础细节

1.

任何一个类都是Class类的实例对象,这个实例对象有三种方式

1 Class c1 = Foo.class//实际是说每个类都有一个隐含的class成员变量

2 Class c2 = foo.getClass()//类的类类型,万事万物皆对象,这个对象称为该类的类类型

3 Class c3 = Class.forName("com.imooc.reflect.Foo")

(c1==c2==c3)=true,一个类只能是Class类的一个实例对象

2.

类是对象,是java.lang.Class的实例对象,这个实例对象有三种表示方式

    class Foo{}   类

  1. Class c1=Foo.Class;   (类名)

  2. Class c2=foo1.getClass();

    c1,c2 表示了父类的类 类型(class type)

   3.Class c3=null;

      c3=Class.forName("com.imooc.reflect.Foo")    类全名

      c1=c2=c3  都是Foo类的类类型

3.编译时刻加载类是静态加载类,运行时刻加载类是动态加载类 new 创建对象是静态加载类,在编译时刻就需要加载所有的可能使用到的类通过Class a=Class.forName(arg[0]);此时为动态加载,因为编译时不知道使用哪个类,因此编译没有加载任何类,通过编译。运行时,根据 Java OfficeBetter Word (Word为arg[0],也是类类型),去确定a是哪个类。这就是动态加载。如果word不存在,此时运行会报错。这就是为何有时候会出现编译通过,运行报错的原因。 动态加载一个好处,就是可以随时增加需要编译的类。

4.

方法的反射:

  1. 获取A类中的print(int,int)方法:

    ①要获取一个方法就是获取类的信息,获取类的信息首先要获取类的类类型

           A a1=new A();  Class c= a1.getClass();

    ②获取方法 由名称和参数列表来决定,getMethod获取的是public方法,getDelcaredMethod获取自己声明的方法

     Method m =c.getMethod(methodName,paramtypes);//paramtypes可以用数组的形式  表示new Class[]{int.class,int.class},也可以直接列举类类型  

    2.方法的反射操作:

    是用m对象来进行方法调用,和a1.print(10,20)调用的方法相同

    m.invoke(a1,new Object[]{10,20})

    Object o=m.invoke(对象名,参数);//方法如果没有返回值返回null,如果有返回值返回具体值,参数可用数组的方式表示,也可以直接列举,没有参数就不写

5.反射的操作都是编译之后的操作 c1==c2结果相等,说明编译之后集合的泛型是去泛型化的java中集合的泛型是防止错误输入的,只在编译阶段有效, 绕过编译泛型就无效了验证:可以通过方法的反射来操作,绕过编译.

6.用户的请求HttpServletRequest--->过滤器filter--->ActionMapper(.action)请求---->过滤器---->ActionProxy---->通过ConfigurationManager读取struts.xml中的ActionInvocation具体的Action类---->通过ActionProxy创建Action反向实例---->拦截器--->action,返回result(字符串对象)对应的视图---->拦截器---->HttpServletResponse返回请求

7.

动态方法调用是为了解决一个Action对应多个请求的处理,以免Action太多。三种方式:指定method属性、感叹号方式、通配符方式1:<action name="add" method="add" class="com.Action.hellowAction">

2:<constant name="struts.enable.DynamicMethodInvocation" value="false">                                                </constant><action name="hellowword" class="com.Action.hellowAction">    

 <result >/result.jsp</result>     

 <result name="add">/add.jsp</result>    

<resultname="update">/update.jsp</result>      </action>http://localhost:8080/struts_hellowworld/aaa/hellowworld!.action

3: <action name="*_*" method="{2}" class="com.Action.{1}Action">     

 <result >/{2}.jsp</result>    

 <result name="add">/{2}.jsp</result>     

 <result name="update">/{2}.jsp</result>      

</action>

http://localhost:8080/struts_hellowworld/aaa/hellow_add.action

优先用第三种

8.

@Struts2---默认Action

<default-action-ref name="index"></default-action-ref>
<action name="index">
   <result>/error.jsp</result>
</action>

9.

@Struts2---编写struts2后缀的三种方式

方式一:在struts.xml中设置

1
<constant name="struts.action.extension" value="do"></constant>

方式二:在struts.properties中设置

1
struts.action.extension=action,do

方式三:在web.xml中的struts2过滤器中初始化参数

1
2
3
4
<init-param>
 <param-name>struts.action.extension</param-name>
 <param-value>do</param-value>
</init-param>


展开阅读全文
©️2020 CSDN 皮肤主题: 大白 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值