1.回顾
1.什么叫XML建模
将XML配置文件中的元素、属性、文本信息转换成对象的过程叫做XML建模2. XML建模
1)根据XML配置文件元素节点创建元素节点实体类
ConfigModel、ActionModel、ForwardModel
2)利用dom4j+xpath技术实现XML建模
ConfigModelFactory
DTD约束:由XML的根节点往里建立约束
XML建模:由最里层节点往根节点进行建模,一个元素节点代表一个实体类思路:
1)xml文件config.xml2)根据XML中元素节点情况(DTD)来定义ConfigModel、ActionModel、ForwardModel对象模型
A.config节点下有多个子action节点,无节点属性
B.action节点下有多个子fowward节点,有节点属性
C.forward下无子节点,有节点属性3)使用Map集合存放子节点元素,其中key为子节点唯一属性,value为整个子节点对象
4)利用工厂模式+dom4j+xpath解析Xml配置文件
2.什么是反射?
反射是一种机制,利用反射机制动态的实例化对象、读写属性、调用方法、构造函数。
3.如何得到类对象
一切反射相关的代码都从获得类对象开始
3种获取方式:
2.1 类名.class;
2.2 对象名.getClass();
2.3 Class.forName(全限定名/全路径名)
1)类名.class
// Class cla=Hello.class;
// System.out.println("获取类的全路径名:"+cla.getName());
// System.out.println("获取简单类名"+cla.getSimpleName());
// System.out.println("获取修饰符"+cla.getModifiers());
// System.out.println("获取包名"+cla.getPackage());
//2)对象名.getClass
// Class clas = hello.getClass();
//
//
//3)Class.forName(类的全路径名/全限定名);
// Class cls=Class.forName("com.zking.entity.Hello");
// Object hello1 = cls.newInstance();
// System.out.println(hello1);
//
4.根据类得到类名(全限定名/全路径名)
1)cName.getName(); -->获取全限定名
2)cName.getSimpleName(); -->获取类名
3)cName.getPackage(); -->获取包名
5.根据类得到类的属性
Field field=cla.getField(“属性名”);
field.getName(); -->获取属性名
filed.getType(); -->获取属性类型
field.getModifiers(); -->获取属性访问修饰符
field.set(Object,Object); -->设置属性值,参数1:要设置属性所在对象;参数2:要设置的值;
field.get(Object); -->获取属性值,参数:要获取属性值的对象
field.getDeclaredField(“属性名”); -->获取单个属性(私有、公有、受保护、默认、静态)
field.getDeclaredFields(); -->获取所有属性(私有、公有、受保护、默认、静态)
//4.读写属性
// 1)获取单个公共的属性
// Field field = cla.getField("age");
// System.out.println(field);
// System.out.println("获取属性名:"+field.getName());
// System.out.println("获取属性访问修饰符"+field.getModifiers());
// System.out.println("获取属性类型"+field.getType());
// 2)获取单个公共,私有的,受保护的的,最终的等等属性
// Field field = cla.getDeclaredField("sid");
// System.out.println(field);
// System.out.println("获取属性名:"+field.getName());
// System.out.println("获取属性访问修饰符"+field.getModifiers());
// System.out.println("获取属性类型"+field.getType());
//
//
// 3)获取所有的公共的属性
// Field[] fields = cla.getFields();
// for (Field field : fields) {
// System.out.println("----------------------");
// System.out.println(field);
// System.out.println("获取属性名:"+field.getName());
// System.out.println("获取属性访问修饰符"+field.getModifiers());
// System.out.println("获取属性类型"+field.getType());
//
// }
//
// 4)获取所有的公共的,私有的,受保护的的,最终的等等属性
// Field[] fields2 = cla.getDeclaredFields();
// for (Field field : fields2) {
// System.out.println("-------------------------");
// System.out.println(field);
// System.out.println("获取属性名:"+field.getName());
// System.out.println("获取属性访问修饰符"+field.getModifiers());
// System.out.println("获取属性类型"+field.getType());
//
//
// }
// 5)赋值:
// Field field = cla.getField("age");
// Field field = cla.getDeclaredField("sname");
// field.setAccessible(true);
// field.set(stu, "s");
// 6)取值:
// Object ostu = field.get(stu);
// System.out.println(ostu);
6.根据类得到类的方法
//无参无返回、无参有参会、有参无返回、有参有返回
cla.getMethod(); -->获取单个公有方法
cla.getDeclaredMethod(); -->获取当个方法(包括私有、受保护、默认、公有)
cla.getMethods(); -->获取所有公有方法
cla.getDeclaredMethods(); -->获取所有的方法(包括私有、受保护、默认、公有)
1)获取单个公共的方法
// Method method = cla.getMethod("hello",null);
//
// System.out.println("获取方法名"+method.getName());
// System.out.println("获取访问修饰符"+method.getModifiers());
// System.out.println("获取参数数量"+method.getParameterCount());
// System.out.println("获取返回值类型"+method.getReturnType());
// 2)获取所有公共的方法
// Method[] methods = cla.getMethods();
// for (Method method2 : methods) {
// System.out.println("-----------------------");
// System.out.println("获取方法名"+method2.getName());
// System.out.println("获取访问修饰符"+method2.getModifiers());
// System.out.println("获取参数数量"+method2.getParameterCount());
// System.out.println("获取返回值类型"+method2.getReturnType());
//
// }
// 3)获取所有公共,私有的,受保护的的,最终的等等方法
// Method[] methods = cla.getDeclaredMethods();
// for (Method method2 : methods) {
// System.out.println("-----------------------");
// System.out.println("获取方法名"+method2.getName());
// System.out.println("获取访问修饰符"+method2.getModifiers());
// System.out.println("获取参数数量"+method2.getParameterCount());
// System.out.println("获取返回值类型"+method2.getReturnType());
//
// }
// 4)获取单个公共,私有的,受保护的的,最终的等等方法
// Method method = cla.getDeclaredMethod("hello",null);
//
// System.out.println("获取方法名"+method.getName());
// System.out.println("获取访问修饰符"+method.getModifiers());
// System.out.println("获取参数数量"+method.getParameterCount());
// System.out.println("获取返回值类型"+method.getReturnType());
7.根据类得到类的构造方法
cla.getConstrutor(); -->获取单个公有构造方法
cla.getDeclaredConstrutor(); -->获取单个构造方法(包括私有、受保护、默认、公有)
cla.getConstrutors(); -->获取所有的公有构造方法
cla.getDeclaredConstrutors(); -->获取所有的构造方法(包括私有、受保护、默认、公有)
//6)调用构造函数:
Constructor constructor = cla.getConstructor(String.class,String.class);
constructor.setAccessible(true);
constructor.newInstance("s","s");
cla.getDeclaredConstructor(Integer.class);
8.根据类得到类的实现接口列表
Class[] interface=cla.getInterfaces(); -->获取类对象中所有实现接口列表
Student实体类:
package com.zking.entity;
public class Student {
private String sid;
private String sname;
public Integer age;
public Student() {
super();
System.out.println("调用无参构造方法创建了一个学生对象");
}
public Student(String sid) {
super();
this.sid = sid;
System.out.println("调用带一个参数的构造方法创建了一个学生对象");
}
public Student(String sid, String sname) {
super();
this.sid = sid;
this.sname = sname;
System.out.println("调用带二个参数的构造方法创建了一个学生对象");
}
@SuppressWarnings("unused")
private Student(Integer age) {
System.out.println("调用Student类私有的构造方法创建一个学生对象");
this.age = age;
}
public String getSid() {
return sid;
}
public void setSid(String sid) {
this.sid = sid;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public void hello() {
System.out.println("你好!我是" + this.sname);
}
public void hello(String name) {
System.out.println(name + "你好!我是" + this.sname);
}
@SuppressWarnings("unused")
private Integer add(Integer a, Integer b) {
return new Integer(a.intValue() + b.intValue());
}
}