1. 程式人生 > >java 反射常用方法(面試常見)

java 反射常用方法(面試常見)

在JDK中,主要由以下類來實現Java反射機制,這些類都位於java.lang.reflect包中: 1.Class類:代表一個類。
2.Field類:代表類的成員變數(成員變數也稱為類的屬性)。
3.Method類:代表類的方法。
4.Constructor類:代表類的構造方法。
5.Array類:提供了動態建立陣列,以及訪問陣列元素的靜態方法。
◆.Class類 在java.lang.Object類中定義了getClass()方法,因此對於任意一個Java物件,都可以通過此方法獲得物件的型別。 Class類是Reflection API中的核心類,它有以下方法 (1)獲得物件的型別: getName():獲得類的完整名字。
getFields():獲得類的public型別的屬性。
getDeclaredFields():獲得類的所有屬性。
getMethods():獲得類的public型別的方法。
getDeclaredMethods():獲得類的所有方法。
getMethod(String name, Class[] parameterTypes):獲得類的特定方法,name引數指定方法的名字,parameterTypes引數指定方法的引數型別。
getConstrutors():獲得類的public型別的構造方法。
getConstrutor(Class[] parameterTypes):獲得類的特定構造方法,parameterTypes引數指定構造方法的引數型別。
newInstance():通過類的不帶引數的構造方法建立這個類的一個物件。 (2)通過預設構造方法建立一個新的物件:
Object objectCopy=classType.getConstructor(new Class[]{}).newInstance(new Object[]{}); (3)獲得物件的所有屬性:
Field fields[]=classType.getDeclaredFields();  Class類的getDeclaredFields()方法返回類的所有屬性,包括public、protected、預設和private訪問級別的屬性。
以上程式碼先呼叫Class類的getConstructor()方法獲得一個Constructor物件,它代表預設的構造方法,然後呼叫Constructor物件的newInstance()方法構造一個例項。 (4)獲得每個屬性相應的getXXX()和setXXX()方法,然後執行這些方法,把原來物件的屬性複製到新的物件中:
Field field=fields[i]; 
String fieldName=field.getName();
 String firstLetter=fieldName.substring(0,1).toUpperCase();
 //獲得和屬性對應的getXXX()方法的名字  String getMethodName="get"+firstLetter+fieldName.substring(1); 
//獲得和屬性對應的setXXX()方法的名字  String setMethodName="set"+firstLetter+fieldName.substring(1); 
//獲得和屬性對應的getXXX()方法
 Method getMethod=classType.getMethod(getMethodName,new Class[]{});
 //獲得和屬性對應的setXXX()方法
 Method setMethod=classType.getMethod(setMethodName,new Class[]{field.getType()}); 
//呼叫原物件的getXXX()方法 
Object value=getMethod.invoke(object,new Object[]{});
 System.out.println(fieldName+":"+value); 
//呼叫複製物件的setXXX()方法
 setMethod.invoke(objectCopy,new Object[]{value});}


◆.Method類的invoke(Object obj,Object args[])方法接收的引數必須為物件,如果引數為基本型別資料,必須轉換為相應的包裝型別的物件。
invoke()方法的返回值總是物件,如果實際被呼叫的方法的返回型別是基本型別資料,那麼invoke()方法會把它轉換為相應的包裝型別的物件,再將其返回。  ◆.Array類 java.lang.Array類提供了動態建立和訪問陣列元素的各種靜態方法。如例程10-4所示的ArrayTester1類的main()方法建立了一個長度為10的字串陣列,接著把索引位置為5的元素設為“hello”,然後再讀取索引位置為5的元素的值。
import java.lang.reflect.*;
public class ArrayTester1 {
  public static void main(String args[])throws Exception {   
 Class classType = Class.forName("java.lang.String");   
//建立一個長度為10的字串陣列  
  Object array = Array.newInstance(classType, 10);   
 //把索引位置為5的元素設為"hello"  
  Array.set(array, 5, "hello");   
//讀取索引位置為5的元素的值   
String s = (String) Array.get(array, 5);    
System.out.println(s);
 }
}


相關推薦

java 反射常用方法(面試常見)

在JDK中,主要由以下類來實現Java反射機制,這些類都位於java.lang.reflect包中: 1.Class類:代表一個類。 2.Field類:代表類的成員變數(成員變數也稱為類的屬性)。 3.Method類:代表類的方法。 4.Constructor類:代表類的

Java 反射常用方法示例

<pre name="code" class="java">import java.lang.reflect.Constructor; import java.lang.reflect.F

Java反射常用到的幾個方法,獲取Private欄位,執行其他類的方法,獲取類名

1.引言 已經很久沒有寫過Java程式碼了,寫了一年的的C++,今天看到C++的friend(友元)可以操作一個類的private屬性,突然想到Java的反射,今天用Java寫了一小段程式碼實驗了一下,專案中比較實用。也是在以前做安卓的專案的時候老是聽到師傅說

Java----list常用方法匯總

實現 如果 date tor 清空 font spa system 相關 package ListTest; import java.util.ArrayList; import java.util.Iterator ; import java.util.List;

java String 常用方法集合

長度 包含 ace contains 判斷 pareto [] div 是否 String a = "abc";String b = "abc";a==b ;//返回true,因為a,b指向的是同一個地址 String a = new String("abc");Strin

Java反射常用API匯總

所有 void 通過 IE get eth AD const tor “JAVA反射機制是在運行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個對象,都能夠調用它的任意方法和屬性” 一、類對象的獲取 1.通過對象獲取 Object obj = n

java反射常用

owin () [1] value obj 實體 .class object ext 測試實體類 public class TestClass { public String classInfo; public String getClassInf

Java String 常用方法

Java String class methods Java String toUpperCase() and toLowerCase() method Java String trim() method Java String startsWith() and endsWith() method Java

JAVA:hashset常用方法和原始碼分析

public static void main(String [] args){ /**hashset特點: * 1.繼承關係 * public class HashSet<E> * extends Ab

JAVA:hashtable常用方法和原始碼分析

public static void main(String[] args) { Hashtable<String,Integer> hashtable=new Hashtable<String, Integer>();

JAVA:HashMap常用方法,對於自定義類的儲存,原始碼分析

public static void main(String[] args) { //hashMap儲存結構為陣列+連結串列 //資料儲存方式為鍵值對 HashMap<String, Integer> hashMap = ne

JAVA:ArrayList常用方法+底層原始碼分析

Arraylist特點:動態開闢,初始容量為10,只能放引用資料型別 ArrayList<Integer> arrayList=new ArrayList<Integer>(); Arraylist增加元素,自增擴容方式1.5倍,Arrays.copyof

透露一下Java軟件工程師面試常見問題集錦之一

contain oge 移動 我們 生命周期 tor string類 行為 servlet 1、面向對象的特征有哪些方面 1.抽象:抽象就是忽略一個主題中與當前目標無關的那些方面,以便更充分地註意與當前目標有關的方面。抽象並不打算了解全部問題,而只是選擇其中的一部分,暫

Servlet(三):生命週期、常用方法常見錯誤

Servlet的生命週期:從第一次呼叫,到伺服器關閉。如果在web.xml 中配置了load-on-startup則是從伺服器開啟到伺服器關閉。 注意: * init方法是對Servlet進行初始化的一個方法,會在Servlet第一次 載入進行儲存時執行 * destory方法是在servlet被銷

Java反射之——方法反射操作

Java反射中 ,方法的反射操作是通過Method物件呼叫invoke(物件,引數)方法,之前我們需要知道怎樣來確定一個方法? 注:通過方法名和引數列表我們可以唯一確定一個方法。 首先我們獲取方法就是獲取類中的資訊,獲取類的資訊需要得到類型別,因此我們通過已知A的例項物件a1,呼叫getCl

java反射拼接方法名動態執行方法

近期由於負責專案的一個模組,該模組下有很多分類,每個分類都有一個編碼code,這個值是作為一個引數攜帶過來的.但是每個code確實對應一個方法的. code的值有很多個,自己又不想做ifelse或者switch判斷於是就狂搜資料,主要讓我發現利用java的反射機制可以完

Java EE 常用方法

用法 解釋 備註 response.sendRedirect(“XXX”) 重定向 不保留引數,兩次請求, session.invalidate(

Java多執行緒面試常見核心問題總結

[27/Jun/2006:10:03:08] WARNING (26140): CORE3283: stderr:"Thread-20" daemon prio=5 tid=0x01394f18 nid=0x109 runnable [6716f000..6716fc28][27/Jun/2006:10:03

java反射獲取方法以及呼叫方法

Java反射獲取方法以及呼叫方法 獲取方法 1.先找到方法所在類的位元組碼 2.找到需要被獲取的方法 Class類中獲取方法: public Method[] getMethods();//獲取包括自身和繼承(實現)過來的所有的public方法——Method不支援泛型&l

Java 反射呼叫方法的引數是陣列的寫法

package com.heatdeath.fight.sort; import java.lang.reflect.Method; import java.util.Arrays; import j