1. 程式人生 > >簡析java反射

簡析java反射

一.什麼是反射:

java反射機制是在執行狀態中,對於任意一個類,都能知道這個類的所有屬性和方法;對於任意一個物件,都能呼叫它的任意方法和屬性 ;反射就是把java類中的各個成分對映成一個個物件;它是框架設計的靈魂。

二.反射的作用:

 1. 編譯:.java->.class     編譯:.class->.java

   2.通過反射機制訪問java物件的屬性,方法和構造方法等

三.具體功能實現:

1.反射之獲取類的物件

     

2.根據類得到全限定名:

     

3.Filed類屬性:


例如:

person實體類

public String pid;
private String pname;
private String psex;
public Person() {
	super();
	// TODO Auto-generated constructor stub
}
public Person(String pid, String pname, String psex) {
	super();
	this.pid = pid;
	this.pname = pname;
	this.psex = psex;
}

demon類:

public static void main(String[] args) throws Exception {

		// 得到類的物件
		Class c = Class.forName("com.zking.Person");
		// 獲取公共屬性
		Field f = c.getField("pid");
		// 獲取屬性名
		System.out.println(f.getName());
		// 得到訪問修飾符 public=1 private =2 protected=4 static=8 final=16  預設=0
		System.out.println(f.getModifiers());
		// 得到屬性的資料型別
		System.out.println(f.getType());
		// 屬性賦值
		// 得到一個例項化物件 newInstance產生一個新的例項 (例項化物件)
		Object person = c.newInstance();
		// 例項
		f.set(person, "001");
		// 取值
		System.out.println(f.get(person));
	 
 	 //獲取屬性
    	 Field f1= c.getDeclaredField("pname");
   	 //設定私有的屬效能夠被訪問
    	 f1.setAccessible(true);
 	 System.out.println(f1);
 	 Object  person1=c.newInstance();
 	 f1.set(person1, "王嘉爾");
      System.out.println(f1.get(person1));
		
		
     //獲取當前類中的所有的屬性
 		Field[] fields=c.getDeclaredFields();
 		Object person=null;
 		for (Field f : fields) {
 			f.setAccessible(true);
 			person=c.newInstance();
 			if("pid".contains(f.getName())) {
 				f.set(person, "002");
 			}else if("pname".contains(f.getName())) {
 				f.set(person, "李易峰");
 			}else if("psex".contains(f.getName())) {
 				f.set(person, "男");
 			}
 			System.out.println(f.get(person));
 		}
 	 //得到父類
 		Class c1=Person.class.getSuperclass();
 	    System.out.println(c1);
		}

注意:getModifiers()獲取的修飾符輸出 

          得到訪問修飾符 public=1 private =2 protected=4 static=8 final=16  預設=0

4.Method方法:


5.構造方法:


例如:

IPerson介面類:

public interface IPerson {
	
	//無參無返回方法
   public void m1();

	//無參有返回方法
   public String m2();
   
	//有引數無返回方法
	public  void m3(String str);

	//有引數有返回方法
	public String m4(Object index,String str);
}

Person實現類:

public class Person implements IPerson {
	

public String pid;
private String pname;
private String psex;
public Person() {
	super();
	// TODO Auto-generated constructor stub
}
public Person(String pid, String pname, String psex) {
	super();
	this.pid = pid;
	this.pname = pname;
	this.psex = psex;
}
@Override
public void m3(String str) {
	// TODO Auto-generated method stub
	System.out.println(str);
	
}
@Override
public String m4(Object index,String str) {
	// TODO Auto-generated method stub
	return  index+str;
}
@Override
public void m1() {
	// TODO Auto-generated method stub
	System.out.println("m1");
}
@Override
public String m2() {
	// TODO Auto-generated method stub
	return "m2";
}

}

demon類:

public class demo1 {
//	<1>新建實體類Person
//	<2>三個欄位:pid pname psex
//	<3>要求該類有父類,並且實現多介面
//	<4>通過反射得到該類所有的屬性和方法,父類和實現介面
	public static void main(String[] args) throws Exception {

//		// 得到類的物件
//		Class c = Class.forName("com.zking.Person");
//		// 獲取公共屬性
//		Field f = c.getField("pid");
//		// 獲取屬性名
//		System.out.println(f.getName());
//		// 得到訪問修飾符 public=1 private =2 protected=4 static=8 final=16  預設=0
//		System.out.println(f.getModifiers());
//		// 得到屬性的資料型別
//		System.out.println(f.getType());
//		// 屬性賦值
//		// 得到一個例項化物件 newInstance產生一個新的例項 (例項化物件)
//		Object person = c.newInstance();
//		// 例項
//		f.set(person, "001");
//		// 取值
//		System.out.println(f.get(person));
	 
//	 //獲取屬性
//   	 Field f1= c.getDeclaredField("pname");
//   	 //設定私有的屬效能夠被訪問
//   	 f1.setAccessible(true);
//	 System.out.println(f1);
//	 Object  person1=c.newInstance();
//	 f1.set(person1, "王嘉爾");
//     System.out.println(f1.get(person1));
		
		
//    //獲取當前類中的所有的屬性
//		Field[] fields=c.getDeclaredFields();
//		Object person=null;
//		for (Field f : fields) {
//			f.setAccessible(true);
//			person=c.newInstance();
//			if("pid".contains(f.getName())) {
//				f.set(person, "002");
//			}else if("pname".contains(f.getName())) {
//				f.set(person, "李易峰");
//			}else if("psex".contains(f.getName())) {
//				f.set(person, "男");
//			}
//			System.out.println(f.get(person));
//		}
//	 //得到父類
//		Class c1=Person.class.getSuperclass();
//	    System.out.println(c1);
		
		
//			<5>並呼叫方法(無參無返回,無參有返回,有引數無返回,有引數有返回)
	    Class c=Class.forName("com.zking.Person");
	    Object o=c.newInstance();
	    //1.有引數無返回方法
	    Method m3=c.getMethod("m3", String.class);
	    m3.invoke(o, "王嘉爾");
	   // 2.有引數有返回方法
	    Method m4=c.getMethod("m4",Object.class, String.class);
	    System.out.println( m4.invoke(o, "24 ","王嘉爾"));
	    //3.無參無返回方法
	    Method m1=c.getMethod("m1", null);
	    m1.invoke(o, null);
	    //4.無參有返回方法
	    Method m2=c.getMethod("m2", null);
	    System.out.println(m2.invoke(o, null));
	}
	
}
綜上為,JAVA反射的再次學習,靈活的運用它,能夠使我們的程式碼更加靈活,但是它也有它的缺點,就是運用它會使我們的軟體的效能降低,複雜度增加,所以還要我們慎重的使用它。

相關推薦

java反射

一.什麼是反射:java反射機制是在執行狀態中,對於任意一個類,都能知道這個類的所有屬性和方法;對於任意一個物件,都能呼叫它的任意方法和屬性 ;反射就是把java類中的各個成分對映成一個個物件;它是框架設計的靈魂。二.反射的作用:  1. 編譯:.java->.clas

LinkedHashMap結構 Java集合之LinkedHashMap

這篇講得比較透徹Java集合之LinkedHashMap。 本文屬於原始碼閱讀筆記。 1.LinkedHashMap簡要介紹。 LinkedHashMap繼承hashMap,並維護一個雙向連結串列保持有序   2.LRU應用 package hashmap_thread; i

java執行緒池 實現原理

什麼是執行緒池     執行緒池是一種多執行緒處理的形式,通過把處理的任務新增到佇列中,然後在建立執行緒後自動執行這些任務。執行緒池可以同時執行多個任務,如果任務佇列已經滿了,則新來的任務就會排隊等待,執行緒池執行緒的數量永遠不會大於既定最大值。 Exector

Java 反射機制,動態代理

也有 object 持久化數據 多場景 字節 問控制 事情 獲取 ted 談談 Java 反射機制,動態代理是基於什麽原理?小編整理了一些java進階學習資料和面試題,需要資料的請加JAVA高階學習Q群:701136382 這是小編創建的java高階學習交流群,加群一起交流

Thrift原理(JAVA)

 Apache Thrift是一個跨語言的服務框架,本質上為RPC,同時具有序列化、反序列化機制;當我們開發的service需要開放出去的時候,就會遇到跨語言呼叫的問題,JAVA語言開發了一個UserService用來提供獲取使用者資訊的服務,如果服務消費端有PHP/Py

《深入理解java虛擬機器》筆記——java類檔案結構

  一直不太搞得明白jvm到底是如何進行類載入的,在看資料的過程中迷迷糊糊,在理解類載入之前,首先看看java的類檔案結構到底是怎樣的,都包含了哪些內容。   我寫了一個最簡單的java程式,根據這個程式來分析一下.class檔案中到底都存了些什麼。 j

JDK框架--java.util包中的工具類庫

題記 JDK,Java Development Kit。 我們必須先認識到,JDK只是,僅僅是一套Java基礎類庫而已,是Sun公司開發的基礎類庫,僅此而已,JDK本身和我們自行書寫總結的類庫,從技術含量來說,還是在一個層級上,它們都是需要被編譯成位元組碼,在JRE中執

java中SET集合

1.特點:無序,物件不可重複注:不可重複指的是能加入重複的值,但是加入值後無效果。注:set之所以能夠實現不重複的資訊,是因為在它包含的add方法中,add操作實際上是賦值給了map,而加入的值則作為了key,map的可以是不能重複的。2.遍歷(迴圈)方式:   FOREAC

番外 01:Spring IoC 實現原理Java反射機制,通過類名建立物件

轉載請註明來源 賴賴的部落格 前景概要 在 01 走進Spring,Context、Bean和IoC 中,我們看到了強大的Spring通過ApplicationContext實現了bean工廠(也就是物件工廠),那究竟是怎麼實現的呢,本次給大家寫一個小D

Java CAS

tun 級別 integer 樂觀鎖 操作 func pri off title 什麽是CAS CAS:Compare and Swap,它是一種原子操作,什麽是原子操作,可以在多線程編程中實現數據交換而不被打斷。是用來更新變量的,當多個線程使用CAS來更新變量時,只有一個

Java多線程——Synchronized(同步鎖)、Lock以及線程池

ati auto bsp lock eas 根據 引入 封裝 util Java多線程 Java中,可運行的程序都是有一個或多個進程組成。進程則是由多個線程組成的。最簡單的一個進程,會包括mian線程以及GC線程。 線程的狀態 線程狀態由以下一張網上圖片來說明:

JAVA裏的CAS算法

true cpp tar library 系統 fail area sync AI Atomic 從JDK5開始, java.util.concurrent包裏提供了很多面向並發編程的類. 使用這些類在多核CPU的機器上會有比較好的性能.主要原因是這些類裏面大多使用(失敗-

Java學習--反碼 原碼 補碼

技術分享 學習 new charat color 分享圖片 相加 -- ... 關於課上實驗中對小數的處理中出現的問題涉及到原碼,反碼,補碼的問題,所以在網上進行了一下搜索。在原碼,反碼,補碼中的解釋可得知,無論是哪一種碼,能夠表示的數的範圍是-2^(位數-1)-1至2^(

Java 8 HashMap 實現機制

最近看《java核心思想》看到了容器部分,本書著重描述了HashMap 的實現機制,對於Map,我們的固有印象便是存取很快,特別是HashMap,我們知道底層是雜湊表結構。但HashMap具體怎麼維護這個資料結構,這是我們今天要記錄的問題。 HashMap的基本組成 要知道Has

java三大框架ssh

一.ssh環境搭配 (1)struts2(web層v和c) ----建立Action ----建立Action核心配置檔案(URL對映),要求類路徑下並且命名為struts.xml ----配置過濾器(沒它不行) (2)spring(業務邏輯層m) ----建

Java資料結構之 AVL樹(平衡二叉樹)

AVL(即平衡二叉樹)樹是帶有平衡條件的二叉查詢樹(二叉查詢樹即左孩子小於根節點,右孩子大於根節點的二叉樹)。一顆AVL樹是其每個節點的左子樹和右子樹的高度最多差 1 的二叉查詢樹(空樹的高度定為-1),只有一個節點的樹高度為0。在高度為h的AVL樹中,最少節點數S(h)=S

Java堆和棧分配原理以及靜態和非靜態關係簡述

1.棧:函式中定義的基本型別變數以及物件的引用變數都是存在於棧中,當定義了一個變數後,就會在棧中為其分配記憶體空間,當這個變數的作用域結束後,就會釋放此變數的記憶體空間,以便另作他用。棧的優勢是,存取速度比堆要快,僅次於直接位於CPU中的暫存器。但存在棧中的資料

黑馬程式設計師 【】java學習之路——GUI開始

------- android培訓、java培訓、期待與您交流! ---------- 需求:實現如下視窗,功能:能夠轉到相應的碟符下顯示該盤內的內容 <span style="font-size:18px;">import java.awt.*; impor

Java觀察者模式案例

在java內部已有內建的觀察者模式,如類 java.util.Observable和類java.util.Observer,即是被觀察者和觀察者。 在 java.util.Observable 中,儲存觀察者物件的容器是Vector,此容器支援動態擴充套件和同步性,用法與ArrayList類似。

Java split()方法

厚顏打廣告,博主個人部落格地址傳送門 split方法的分類 關於Java中的split方法,這裡大致分為三種: 假定字串String = “1,2,,,,,”,使用不同的split方法的話,其效果如下面所示; js中的split方法 使用的方法: var str