簡析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