任何一个类都是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{} 类
Class c1=Foo.Class; (类名)
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.
方法的反射:
获取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
>
|