當前位置:首頁 » 編程語言 » java反射class

java反射class

發布時間: 2022-08-12 07:21:53

『壹』 什麼是java的反射

Java反射指的是對於任何的一個java類,我們都可以通過反射獲取到這個類的所有屬性和方法(包含私有的屬性方法),使用java反射我們也可以調用一個對象的任何方法。
我們知道Java是一門面向對象編程的語言,我們編程的時候,經常會將類的屬性進行封裝,然後提供public方法進行屬性的設置和獲取。類的屬性我們通常會設置成private的私有屬性,為的就是保護對象屬性不被隨意的修改和訪問。但是反射機制卻恰恰相反,通過反射,我們可以獲取到這些被保護的屬性和方法,並且可以修改和訪問他們。
在java中我們可以使用object對象的getClass();方法獲得Class的對象classObject;語法格式為 Class classObject = object.getClass() ;可以根據Class對象的方法獲取object對象的相關屬性和方法;
獲取object對象的名字可以使用 classObject.getName();獲取類的名稱,獲取到的結果包含包的名稱;
獲取object對象的包名稱,可以使用classObject.getPackage();獲取包的名稱;
獲取object對象的所有public屬性,可以使用classObject.getFields();方法,返回列表是屬性類Field[]對象列表;
獲取object對象所有屬性,可以使用classObject.getDeclaredFields();方法,返回的是所有屬性列表(包含private屬性);
獲取object對象某個特定的屬性,可以使用classObject.getField( fieldName );可以根據屬性名稱獲取屬性類的對象;
獲取object對象private屬性,可以使用classObject.getDeclaredField( fieldName );根據屬性名獲取屬性對象信息;
獲取object對象public方法,使用classObject.getMethods();可以獲取到方法類Method[]對象列表;
獲取object對象某個特定的public方法,使用classObject.getMethod( funName , Class... parameterTypes);根據方法名和方法參數類型列表,可以獲取到方法類的對象;
獲取object對象所有方法(包含private方法);使用classObject.getDeclaredMethods();可以獲取所有的方法對象列表;
獲取object對象某個特定方法(包含private方法),使用classObject.getDeclaredMethod ( funName, Class... parameterTypes );根據方法名和方法參數類型列表,可以獲取到類的特定方法(包含private方法);
獲取object對象類中所有的public構造方法,可以使用classObject.getConstructors(); 獲取到構造類Constructor的對象列表;
獲取object對象類中某個特定的構造方法,可以使用classObject.getConstructor( Class... parameterTypes ); 根據參數類型列表,獲取指定的構造函數對象;
獲取object對象類中所有的構造方法(包含private),可以使用classObject.getDeclaredConstructors(); 獲取到構造類Constructor的對象列表;
獲取object對象類中某個特定的構造方法(包含private),可以使用classObject.getDeclaredConstructor( Class... parameterTypes ); 根據參數類型列表,獲取指定的構造函數對象;

『貳』 什麼是反射什麼Java反射

java反射是什麼意思呢?下面帶大家了解一下。
JAVA反射是指程序可以訪問、檢測和修改它本身狀態或行為的一種能力。反射是一種強大的工具,能夠創建靈活的代碼,可以使代碼在運行時裝配,無需在組件之間進行源代表鏈接。
JAVA反射機制是在運行狀態中,知道所有屬性和方法,對於任意一個對象,能夠調用它的方法和屬性,這種動態獲取的信息以及動態調用對象的方法的功能的反射機制。
反射適合用在哪

首先我們先思考一個問題,反射適合使用在哪裡呢?從功能上看,反射似乎無所不能,幾乎所有的類,所有的屬性、方法、構造我們都能使用,但是我們細細思考一下,在實際開發中,並不是所有場景都需要使用反射獲取屬性或者方法進行操作,反而更多的使用實例.xxx方式操作,而當這些操作重復次數較多的時候,我們往往會考慮優化代碼,減少代碼冗餘,提高復用,比如實體構建賦值等操作,這個時候往往是我們最需要復用的地方,所以我們可以大體認為反射主要使用在實體操作過程中。而在一般操作數據的過程中,我們的實體一般都是知道並且依賴於對應的數據類型的,比如:
1.根據類型new的方式創建對象
2.根據類型定義變數,類型可能是基本類型也可能是引用類型、類或者介面
3.將對應類型的對象傳遞給方法
4.根據類型訪問對象的屬性,調用方法等操作
以上這些操作都是數據操作的過程中最常見也是最難復用優化的地方,而如果這里的操作使用反射則可以實現動態的操作不同的類型的實例,通過調用反射入口類Class,獲取對應的屬性、構造、方法完成對應的操作

『叄』 Java反射裡面 Type 與Class 的作用有什麼不同

1: 類型的概念
概念:類型刻劃了一組值及其上可施行的操作,可理解為值集和操作集構成的二元組。

類型的概念與值的概念相對立,前者是程序中的概念,後者則是程序運行時的概念,兩者通過標識值的語言成分(例如,變數、表達式等)聯系起來。

比如變數v說明為具有類型T,類型T所刻劃的值集為{v1,v2,…vn,…},則變數v運行時能取且只能取某個vi為值。由此可見,類型規定了具有該類型的變數或表達式的取值范圍。

2: 類與類型

A: 共性

在對象式語言中,「值」為對象(或對象指引,但本質上仍為對象)。所以,對象式語言中的類型刻劃了一組對象及其上可施行的操作。類型所刻劃的對象稱為類型的實例。類也刻劃了一組對象。
兩者的共性在於二者均刻劃了一組對象及其上的操作(在前面關於類的討論中,並未強調類刻劃對象上的操作這一事實),所以,既可以說對象是類型的實例,也可以說對象是類的實例,類型和類在與對象的關繫上是相同的。不過,類型欲刻劃一組對象及其上的操作,必須藉助於類,因為類是達到這種目的的唯一設施。由此可見,類型是以類為基礎的,是通過類來定義的,這體現了二者的聯系。
B: 區別
l 作用不同
類是程序的構造單位,是描述一組對象及其上操作的唯一語言成分,故其作用主要是具體描述這組對象,提供運行時創建這些對象的「模板」。例如,基於類間的繼承關系的派生類定義設施就反映了類在描述對象方面的作用。

類型則是標志變數或表達式取值范圍的一種語言成分,其作用主要是對這些變數或表達式運行時的取值進行約束。例如,對賦值語句左部的變數和右部的表達式的類型匹配檢查就反映了類型的約束作用。

l 與對象聯系的緊密程序不同

類描述對象的具體形式和其上可施行的具體操作,且強調所描述的一組對象的共性,因而,與具體對象聯系較密切,而與對象集的大小則聯系較少。

類型強調所描述的一組對象的范圍和可施行操作的范圍,與對象集的大小聯系較密切,而與其中具體對象則聯系較少。

l 並不是所有類都可直接作為類型使用
類是類型的基礎,類型靠類來定義,有些類可直接作為類型來使用,在這種意義下,我們也可稱這些類是類型。
但是,也有一些類不能直接作為類型來使用,這是因為,從類型的約束作用來看,類型強調所刻劃的對象的確定性,即對象范圍的確定性。因此,只有所描述的對象的范圍確定的類才可直接用作類型。

『肆』 JAVA反射機制的Class

眾所周知Java有個Object 類,是所有Java 類的繼承根源,其內聲明了數個應該在所有Java 類中被改寫的方法:hashCode()、equals()、clone()、toString()、getClass()等。其中getClass()返回一個Class 對象。
Class 類十分特殊。它和一般類一樣繼承自Object,其實體用以表達Java程序運行時的classes和interfaces,也用來表達enum、array、primitive Java types(boolean, byte, char, short, int, long, float, double)以及關鍵詞void。當一個class被載入,或當載入器(class loader)的defineClass()被JVM調用,JVM 便自動產生一個Class 對象。如果您想藉由「修改Java標准庫源碼」來觀察Class 對象的實際生成時機(例如在Class的constructor內添加一個println()),這樣是行不通的!因為Class並沒有public constructor。
Class是Reflection故事起源。針對任何您想探勘的類,唯有先為它產生一個Class 對象,接下來才能經由後者喚起為數十多個的Reflection APIs。這些APIs將在稍後的探險活動中一一亮相。
public final
class Class<T> implements Serializable,
java.lang.reflect.GenericDeclaration,
java.lang.reflect.Type,
java.lang.reflect.AnnotatedElement {
private Class() {}
public String toString() {
return ( isInterface() ? interface :
(isPrimitive() ? : class ))
+ getName();
}
...
圖1:Class class片段。注意它的private Class() {},意指不允許任何人經由編程方式產生Class object。是的,其object 只能由JVM 產生。

『伍』 java中反射的三種方法是

第一種:通過forName()方法;

第二種:類.class;

第三種:對象.getClass()。

舉例如下:

package
test;

public class Demo{

public static void
main(){

Class<?> c1 = null;

Class<?> c2 =
null;

Class<?> c3 =
null;

//三種反射用實例化方式

try{

//最常用的一種形式

c1 =
Class.forName("test.X");

}catch(ClassNotFoundException
e){

e.printStackTrace();

}

//通過Object類中的方法實例化

c2
= new X().getClass();

//通過類.class實例化

c3 =
X.class;

System.out.println("類名:" + c1.getName());
//得到類名

System.out.println("類名:" + c2.getName());
//得到類名

System.out.println("類名:" + c3.getName());
//得到類名

}

}

『陸』 java反射機制詳解

反射就是把Java的各種成分映射成相應的Java類。
Class類的構造方法是private,由JVM創建。
反射是java語言的一個特性,它允程序在運行時(注意不是編譯的時候)來進行自我檢查並且對內部的成員進行操作。例如它允許一個java的類獲取他所有的成員變數和方法並且顯示出來。Java 的這一能力在實際應用中也許用得不是很多,但是在其它的程序設計語言中根本就不存在這一特性。例如,Pascal、C 或者 C++ 中就沒有辦法在程序中獲得函數定義相關的信息。(來自Sun)
JavaBean 是 reflection 的實際應用之一,它能讓一些工具可視化的操作軟體組件。這些工具通過 reflection 動態的載入並取得 Java 組件(類) 的屬性。
反射是從1.2就有的,後面的三大框架都會用到反射機制,涉及到類"Class",無法直接new CLass(),其對象是內存里的一份位元組碼.
Class 類的實例表示正在運行的 Java 應用程序中的類和介面。枚舉是一種類,注釋是一種介面。每個數組屬於被映射為 Class 對象的一個類,所有具有相同元素類型和維數的數組都共享該 Class 對象。
基本的 Java類型(boolean、byte、char、short、int、long、float 和 double)和關鍵字 void 也表示為 Class 對象。Class 沒有公共構造方法。
Class 對象是在載入類時由 Java 虛擬機以及通過調用類載入器中的 defineClass 方法自動構造的。
Person p1 = new Person();
//下面的這三種方式都可以得到位元組碼
CLass c1 = Date.class();
p1.getClass();
//若存在則載入,否則新建,往往使用第三種,類的名字在寫源程序時不需要知道,到運行時再傳遞過來
Class.forName("java.lang.String");

Class.forName()位元組碼已經載入到java虛擬機中,去得到位元組碼;java虛擬機中還沒有生成位元組碼 用類載入器進行載入,載入的位元組碼緩沖到虛擬機中。
另外,大家可以關注微信公眾號Java技術棧回復:JVM,獲取我整理的系列JVM教程,都是干貨。
考慮下面這個簡單的例子,讓我們看看 reflection 是如何工作的。
import java.lang.reflect.*;

public class DumpMethods {
public static void main(String args[]) {
try {
Class c = Class.forName("java.util.Stack");

Method m[] = c.getDeclaredMethods();

for (int i = 0; i < m.length; i++)
System.out.println(m[i].toString());
}
catch (Throwable e){
System.err.println(e);
}
}
}

public synchronized java.lang.Object java.util.Stack.pop()
public java.lang.Object java.util.Stack.push(java.lang.Object)
public boolean java.util.Stack.empty()
public synchronized java.lang.Object java.util.Stack.peek()
public synchronized int java.util.Stack.search(java.lang.Object)

這樣就列出了java.util.Stack 類的各方法名以及它們的限制符和返回類型。這個程序使用 Class.forName 載入指定的類,然後調用 getDeclaredMethods 來獲取這個類中定義了的方法列表。java.lang.reflect.Methods 是用來描述某個類中單個方法的一個類。
以下示例使用 Class 對象來顯示對象的類名:
void printClassName(Object obj) {
System.out.println("The class of " + obj +
" is " + obj.getClass().getName());
}

還可以使用一個類字面值(JLS Section 15.8.2)來獲取指定類型(或 void)的 Class 對象。例如:
System.out.println("The name of class Foo is: "+Foo.class.getName());

在沒有對象實例的時候,主要有兩種辦法。
//獲得類類型的兩種方式
Class cls1 = Role.class;
Class cls2 = Class.forName("yui.Role");

注意第二種方式中,forName中的參數一定是完整的類名(包名+類名),並且這個方法需要捕獲異常。現在得到cls1就可以創建一個Role類的實例了,利用Class的newInstance方法相當於調用類的默認的構造器。
Object o = cls1.newInstance();
//創建一個實例
//Object o1 = new Role(); //與上面的方法等價

『柒』 Java中為什麼反射機制中的屬性的類型是Class類型的 方式機制中那麼哪些東西是Class類型的呢

什麼意思呢? 屬性類型是Class類型的? 沒懂..
Class是個類, 一個可以實例化任意一個類的類, 在反射裡面經常用到.

『捌』 java怎麼樣使用class反射!!!

這是我自己寫的一個類,用java反射寫的。有多個功能。如數據拷貝等。具體請看代碼注釋(超過10000字不讓發。)你可以參考一下完整代碼可以到我空間查看 public class BaseClass {

/**
* @描述: 執行指定對象的指定方法(該方法更適合於執行無參的構造方法和有參的方法)
* @param obj 需要執行的對象的實例(如果對象的實例不存在即指定 obj == null,則系統會新創建一個實例);
* @param className 需要執行的對象的實例(如果對象的實例不存在即指定 obj == null,則系統會新創建一個實例);
* @param className 對象的名稱(需要添加包名如 com.bin.test.testBean其中com.bin.test為包名testBean為方法名)
* @param methodName 需要執行對象中的方法名稱(可通過displayAllMethod(T t))來查看該對象有哪些方法 如:Test對象中有方法
* setAge(int age);則methodName應寫為[setAge]
* @param methodParmeterNames 需要執行的方法的參數名 基本類型可直接用int,char等來表示,但是如果是其他類型如List則必需寫成java.util.List具體參數類型可通過displayAllMethod(T t)
* 方法來查看該對象的所有方法及需要的參數類型) 同時請注意:methodParmeterNames必須和methodParmeterValues配對出現且數量必須一樣;如methodParmeterNames
* 為null則參數methodParmeterValues也必須為null(即無參方法),如methodParmeterNames長度為1,則methodParmeterValues的長度也必須為1
* @param methodParmeterValues 需要執行的方法的參數值 請注意:methodParmeterNames必須和methodParmeterValues配對出現且數量必須一樣;如methodParmeterNames
* 為null則參數methodParmeterValues也必須為null(即無參方法),如methodParmeterNames長度為1,則methodParmeterValues的長度也必須為1
* @return
*/
public Object executeMethod(Object obj,String className,String methodName,String[]methodParmeterNames,Object[] methodParmeterValues){
return executeMethod(obj, className, null, null, methodName, methodParmeterNames, methodParmeterValues);
}
/**
* @描述: 執行指定對象的指定方法(該方法更適合於執行無參的構造方法和無參的方法)
* @param obj 需要執行的對象的實例(如果對象的實例不存在即指定 obj == null,則系統會新創建一個實例);
* @param className 對象的名稱(需要添加包名如 com.bin.test.testBean其中com.bin.test為包名testBean為方法名)
* @param methodName 需要執行對象中的方法名稱(可通過displayAllMethod(T t))來查看該對象有哪些方法 如:Test對象中有方法
* setAge(int age);則methodName應寫為[setAge]
* @return
*/
public Object executeMethod(Object obj,String className,String methodName){
return executeMethod(obj, className, null, null, methodName, null, null);
}
/**
* @描述: 執行指定對象的指定方法
* @param obj 需要執行的對象的實例(如果對象的實例不存在即指定 obj == null,則系統會新創建一個實例);
* @param className 對象的名稱(需要添加包名如 com.bin.test.testBean其中com.bin.test為包名testBean為方法名)
* @param ConstructorParameterNames 構造方法的參數名 基本類型可直接用int,char等來表示,但是如果是其他類型如List則必需寫成java.util.List具體參數類型可通過displayAllConstructor(T t)
* 方法來查看該對象的所有構造方法及需要的參數類型) 同時請注意:ConstructorParameterNames必須和ConstructorParameterValues配對出現且數量必須一樣;如ConstructorParameterNames
* 為null則參數ConstructorParameterValues也必須為null(即無參構造方法),如ConstructorParameterNames長度為1,則ConstructorParameterValues的長度也必須為1
* @param ConstructorParameterValues 構造方法的參數值 請注意:ConstructorParameterNames必須和ConstructorParameterValues配對出現且數量必須一樣;如ConstructorParameterNames
* 為null則參數ConstructorParameterValues也必須為null(即無參構造方法),如ConstructorParameterNames長度為1,則ConstructorParameterValues的長度也必須為1
* @param methodName 需要執行對象中的方法名稱(可通過displayAllMethod(T t))來查看該對象有哪些方法 如:Test對象中有方法
* setAge(int age);則methodName應寫為[setAge]
* @param methodParmeterNames 需要執行的方法的參數名 基本類型可直接用int,char等來表示,但是如果是其他類型如List則必需寫成java.util.List具體參數類型可通過displayAllMethod(T t)
* 方法來查看該對象的所有方法及需要的參數類型) 同時請注意:methodParmeterNames必須和methodParmeterValues配對出現且數量必須一樣;如methodParmeterNames
* 為null則參數methodParmeterValues也必須為null(即無參方法),如methodParmeterNames長度為1,則methodParmeterValues的長度也必須為1
* @param methodParmeterValues 需要執行的方法的參數值 請注意:methodParmeterNames必須和methodParmeterValues配對出現且數量必須一樣;如methodParmeterNames
* 為null則參數methodParmeterValues也必須為null(即無參方法),如methodParmeterNames長度為1,則methodParmeterValues的長度也必須為1
* @return
*/
public Object executeMethod(Object obj,String className,String[]ConstructorParameterNames,Object[] ConstructorParameterValues,String methodName,String[]methodParmeterNames,Object[] methodParmeterValues) {
try {
//如果用戶未指定一個對象的實例則方法會自動為用戶創建一個對象的實例
if(obj==null)obj = getInstance(className, ConstructorParameterNames, ConstructorParameterValues);//創建一個實例
//將用戶傳遞進入的參數轉換為相應的class參數類型
Class[] methodParName = getMethodClass(methodParmeterNames);
//從指定對象實例中獲取指定方法
Method method = obj.getClass().getMethod(methodName, methodParName);
//執行該實例的某個方法
return method.invoke(obj, methodParmeterValues);
} catch (SecurityException e) {
e.printStackTrace();
return null;
} catch (NoSuchMethodException e) {
e.printStackTrace();
return null;
} catch (IllegalArgumentException e) {
e.printStackTrace();
return null;
} catch (IllegalAccessException e) {
e.printStackTrace();
return null;
} catch (InvocationTargetException e) {
e.printStackTrace();
return null;
}

}

/**
* @描述: 創建對象的一個新實例
* @param className 對象的名稱(需要添加包名如 com.bin.test.testBean其中com.bin.test為包名testBean為方法名)
* @return Object對象的新實例(創建失敗返回null)
*/
public Object getInstance(String className){
return getInstance(className, null, null);
}

/**
* @描述: 創建對象的一個新實例
* @param className 對象的名稱(需要添加包名如 com.bin.test.testBean其中com.bin.test為包名testBean為方法名)
* @param parameterNames 構造方法的參數名 parameterNames必須和parameterValues配對出現且數量必須一樣;如parameterNames
* 為null則參數parameterValues也必須為null(即無參構造方法),如parameterNames長度為1,則parameterValues的長度也必須為1
* @param parameterValues 構造方法的參數值 parameterValues必須和parameterNames配對出現且數量必須一樣;如parameterValues
* 為null則參數parameterNames也必須為null(即無參構造方法),如parameterValues長度為1,則parameterNames的長度也必須為1
* @return Object對象的新實例(創建失敗返回null)
*/
public Object getInstance(String className,String[]parameterNames,Object[] parameterValues){
//載入class
try {
Class cls = Class.forName(className);
//將用戶傳遞進入的參數轉換為相應的class參數類型
Class[] classPar = getMethodClass(parameterNames);//獲取構造方法對應的參數類型
//獲取指定對象的構造方法
Constructor cst = cls.getConstructor(classPar);
Object obj = null;
//根據參數類型創建一個對象的實例
if(classPar==null||classPar.length==0){
obj = cst.newInstance(null);
}else{
obj = cst.newInstance(parameterValues);
}
return obj;
} catch (ClassNotFoundException e) {
e.printStackTrace();
return null;
} catch (SecurityException e) {
e.printStackTrace();
return null;
} catch (NoSuchMethodException e) {
e.printStackTrace();
return null;
} catch (IllegalArgumentException e) {
e.printStackTrace();
return null;
} catch (InstantiationException e) {
e.printStackTrace();
return null;
} catch (IllegalAccessException e) {
e.printStackTrace();
return null;
} catch (InvocationTargetException e) {
e.printStackTrace();
return null;
}

}

/**
* @描述:將一個bean中的欄位內容 復制到另一個bean上(注意:前提條件為名稱相同並且類型相同)
* @param <T>
* @param <S>
* @param t 目標對象(注意:目標對象中必須與源對象中存在名稱相同,且類型相同的欄位)
* @param s 數據源對象(注意:源對象中必須與目標對象中存在名稱相同,且類型相同的欄位)
* @return
*/
public <T,S> T (T t, S s){
try {
setValueToBean(t,s);
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return t;
}

/**
* @描述:查詢該對象的所有構造方法(包含私有方法)
* @param <T>
* @param t
*/
public <T>void displayAllConstructor(T t){
for(int i=0;i<t.getClass().getDeclaredConstructors().length;i++){
System.out.println(t.getClass().getDeclaredConstructors()[i]);
}
}
/**
* @描述:查詢該對象的所有方法(包含私有方法)
* @param <T>
* @param t
*/
public <T> void displayAllMethod(T t){
for(int i=0;i<t.getClass().getDeclaredMethods().length;i++){
System.out.println(t.getClass().getDeclaredMethods()[i]);
}
}
/**
* @描述:查詢該對象的所有欄位(包含私有方法)
* @param <T>
* @param t
*/
public <T> void displayAllField(T t){
for(int i=0;i<t.getClass().getDeclaredFields().length;i++){
System.out.println(t.getClass().getDeclaredFields()[i]);
}
}
//後面的代碼刪除了。。因過長

熱點內容
蘋果的文件怎麼轉到安卓 發布:2025-01-20 22:43:10 瀏覽:652
c語言迴文串 發布:2025-01-20 22:43:09 瀏覽:767
垃圾壓縮價格 發布:2025-01-20 22:14:05 瀏覽:421
溫十系統如何看處理器配置 發布:2025-01-20 21:59:47 瀏覽:302
米號源碼 發布:2025-01-20 21:55:30 瀏覽:893
電信四川dns伺服器ip 發布:2025-01-20 21:54:51 瀏覽:92
電腦彈出腳本錯誤還能繼續使用嗎 發布:2025-01-20 21:42:29 瀏覽:586
安卓私密照片在哪裡 發布:2025-01-20 21:41:05 瀏覽:5
同濟復試編譯原理 發布:2025-01-20 21:33:54 瀏覽:310
c語言判斷字母 發布:2025-01-20 21:31:09 瀏覽:424