[J2EE-08]-反射

1.回顾

1.什么叫XML建模
将XML配置文件中的元素、属性、文本信息转换成对象的过程叫做XML建模

2. XML建模
   1)根据XML配置文件元素节点创建元素节点实体类
   ConfigModel、ActionModel、ForwardModel
   2)利用dom4j+xpath技术实现XML建模
   ConfigModelFactory


   DTD约束:由XML的根节点往里建立约束
   XML建模:由最里层节点往根节点进行建模,一个元素节点代表一个实体类

思路:
1)xml文件config.xml

2)根据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());
	}
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值