J2EE 反射(Reflect)

在jdk的配置环境中   从俩个地方体现出:一个是XML解析  另一个是实体类 而实体类则需要运用反射
jdk里面jre转译:是将.java文件转化为.class的文件                    
而今天我们说的是反射  它是将.class文件转为.java文件             
 

1. 什么是反射?
   反射是java语言中的一种机制,通过这种机制可以动态的实例化对象、读写属性、调用方法

2.反射3大作用

  实例化对象

      c.newInstance()  --实例化

  动态调用方法
      Method m; --找到方法

      m.invoke --调用

   读写属性

      Field set/get   --设置值和获取                                                                                                                                                 Field f=p.getDeclaredField("属性名");  得到单个属性                                                                                                             Field [] fall=person.getDeclaredFields();  得到全部的属性


3.如何运行反射?

   比如: 新建实体类Person,设置好三个字段:pid pname psex ,通过反射得到该类所有的属性和方法,父类,并调用方法(无参无返回,无参有返回,有参数无返回,有参数有返回).

      一切反射相关的代码都从获得类对象开始 以下有三个获取类对象的方法
  1 Class.forName(完整类名) --(我们最常用的一种)
  2 类名.class

  3 对象.getClass()

创建实体类Person 写4个简单方法

public class Person{
//implements Reflect
	/**
	 * id
	 */
	private String pid;
	/**
	 * 姓名
	 */
	private String pname;
	 
	/**
	 * 性别
	 */
	private String psex;
  
	//无参无返回 
	public void m1() {
		System.out.println("m1");
	}


	//无参有返回 
	public String m2() { 
		return "m2";
	}


	//有参数无返回 
	public void m3(String pid, String pname, String psex) { 
		System.out.println(pid+pname+psex);
	}


	//有参数有返回 
	public String m4(String pid, String pname, String psex) { 
		return pid+pname+psex;
	}  
       }

写反射的内容 读写属性

//得到类对象	
	Class person=Class.forName("com.list.reflect.Person");
	//实例化对象
	Object p=null;
	//属性  Field f=p.getDeclaredField("pid");  得到单个属性
	//得到Person全部的属性  是一个数组getDeclaredFields  类对象获取全部的属性
	Field [] fall=person.getDeclaredFields();
	for (Field f : fall) {
		//设置可以访问 千万别忘记啦
		f.setAccessible(true);
		//实例化对象  
		p=person.newInstance();
		//赋值
		if("pid".contains(f.getName())) {
           	 f.set(p, "001");		    
		}
		else if("pname".contains(f.getName())) {
			f.set(p, "张张");
		}
		else if("psex".contains(f.getName())) {
			f.set(p, "女");
		}
		//得到全部的属性 
		 System.out.println(f.getName());
		 
	    }

调用方法

Method [] method=person.getDeclaredMethods();
	for (Method m : method) {
		p=person.newInstance();
		if("m1".contains(m.getName())) {
			 m.invoke(p, null);
			//System.out.println(m.getParameterTypes());
		}
		if("m2".contains(m.getName())) { 
			 System.out.println(m.invoke(p, null));
		}
        if("m3".contains(m.getName())) {
			System.out.println(m.invoke(p, "010","张家人","男"));
		}
        if("m4".contains(m.getName())) {
	        System.out.println(m.invoke(p, "003","王jk","男"));
        }
        //得到所有的方法
        System.out.println(m.getName());
	}

总结:感觉自己懂得反射的东西并不是很深,需要在深入的去思考和钻研,今天就写了一些简单的代码,以后知道的话会补上一些遗漏的知识点的  ,以下再附上一张关于反射的知识点,从一位大神那里纳莱的 ,嘿嘿,就这样吧!



猜你喜欢

转载自blog.csdn.net/qqqnzhky/article/details/80548864
今日推荐