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

總結:感覺自己懂得反射的東西並不是很深,需要在深入的去思考和鑽研,今天就寫了一些簡單的代碼,以後知道的話會補上一些遺漏的知識點的  ,以下再附上一張關於反射的知識點,從一位大神那裏納萊的 ,嘿嘿,就這樣吧!



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章