㈠ java中的反射怎麼用怎麼理解反射
反射理解博客
推薦你一篇文章,裡面的例子可以我覺得會有助於你對反射的理解 簡單易懂
㈡ java反射的理解
簡單的話就是根據一個類名,把類里的構造器啊,方法啊,屬性啊什麼的都可以得到。InvocationHandler這個是真沒用過
㈢ JAVA 反射
你為啥要把類名設置為Class呢,那後面的Class clazz申明的就是你所寫的這個Class,不錯才怪。改一個類名吧
㈣ JAVA中反射是什麼
JAVA中反射是動態獲取信息以及動態調用對象方法的一種反射機制。
Java反射就是在運行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個對象,都能夠調用它的任意方法和屬性;並且能改變它的屬性。而這也是Java被視為動態語言的一個關鍵性質。
Java反射的功能是在運行時判斷任意一個對象所屬的類,在運行時構造任意一個類的對象,在運行時判斷任意一個類所具有的成員變數和方法,在運行時調用任意一個對象的方法,生成動態代理。
(4)反射java擴展閱讀:
JAVA中反射實例:
1、Class superClass=clazz.getSuperclass();//獲取父類。
System.out.println("getSuperclass:"+superClass)。
2、Class[] interfaces=clazz.getInterfaces();//獲取實現介面。
System.out.println("getInterfaces:"+interfaces.length)。
3、Constructor[] cons=clazz.getConstructors();//構造方法。
System.out.println("getConstructors:"+cons.length)。
參考資料來源:網路: JAVA反射機制
㈤ 反射機制在java中如何做呀
首先大體介紹下反射機制:JAVA反射機制是在運行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個對象,都能夠調用它的任意一個方法和屬性;這種動態獲取的信息以及動態調用對象的方法的功能稱為java語言的反射機制。 舉個簡單的列子 import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; public class ReflectTester { /** * 通過java的反射機制獲取類的所有屬性和方法 */ public void test1() { try { Class c = Class.forName("demo1.client.Customer"); System.out.println("屬性:"); Field f[] = c.getDeclaredFields(); for (int i = 0; i < f.length; i++) { System.out.println(f[i].getName()); } System.out.println("方法:"); 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); } } /** * 通過java的反射機制動態修改對象的屬性 * @param o */ public void test2(Customer o) { try { Class c = o.getClass(); //getMethod方法第一個參數指定一個需要調用的方法名稱,第二個參數是需要調用方法的參數類型列表,如無參數可以指定null,該方法返回一個方法對象 Method sAge = c.getMethod("setAge", new Class[] { int.class }); Method gAge = c.getMethod("getAge", null); Method sName = c.getMethod("setName", new Class[] { String.class }); //動態修改Customer對象的age Object[] args1 = { new Integer(25) }; sAge.invoke(o, args1); //動態取得Customer對象的age Integer AGE = (Integer) gAge.invoke(o, null); System.out.println("the Customer age is: " + AGE.intValue()); //動態修改Customer對象的name Object[] args2 = { new String("李四") }; sName.invoke(o, args2); } catch (Throwable e) { System.err.println(e); } } /** * 通過java的反射機製做一個簡單對象的克隆 * @param o * @return */ public Object test3(Customer o) { Object o2 = null; try { Class c = o.getClass(); //通過默認構造方法創建一個新的對象 o2 = c.getConstructor(new Class[] {}).newInstance( new Object[] {}); Field fields[] = c.getDeclaredFields(); for (int i = 0; i < fields.length; i++) { 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 = c.getMethod(getMethodName, new Class[] {}); // 獲得和屬性對應的setXXX()方法 Method setMethod = c.getMethod(setMethodName, new Class[] { field.getType() }); // 調用原對象的getXXX()方法 Object value = getMethod.invoke(o, new Object[] {}); // 調用拷貝對象的setXXX()方法 setMethod.invoke(o2, new Object[] { value }); } } catch (Throwable e) { System.err.println(e); } return o2; } public static void main(String[] args) throws Exception { ReflectTester t = new ReflectTester(); t.test1(); Customer customer = new Customer(); customer.setAge(20); customer.setName("張三"); System.out.println("調用前name: " + customer.getName()); System.out.println("調用前age: " + customer.getAge()); t.test2(customer); System.out.println("調用後name: " + customer.getName()); System.out.println("調用後age: " + customer.getAge()); Customer customer2 = (Customer)t.test3(customer); System.out.println("克隆對象的name: " + customer2.getName()); System.out.println("克隆對象的age: " + customer2.getAge()); } } class Customer { private long id; private String name; private int age; public Customer() { } public Customer(String name, int age) { this.name = name; this.age = age; } public long getId() { return id; } public void setId(long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } 你可以自己運行下看看,再修改一些看看
㈥ java中的反射可以做什麼
Java反射機制主要提供了以下功能:
在運行時判斷任意一個對象所屬的類;
在運行時構造任意一個類的對象;
在運行時判斷任意一個類所具有的成員變數和方法;
在運行時調用任意一個對象的方法;生成動態代理。
JAVA有著一個非常突出的動態相關機制:Reflection。
這個字的意思是「反射、映象、倒影」,用在Java身上指的是我們可以於運行時載入、探知、使用編譯期間完全未知的classes。換句話說,Java程序可以載入一個運行時才得知名稱的class,獲悉其完整構造(但不包括methods定義),並生成其對象實體、或對其fields設值、或喚起其methods。這種「看透class」的能力(the ability of the program to examine itself)被稱為introspection(內省、內觀、反省)。Reflection和introspection是常被並提的兩個術語。
㈦ Java反射實現幾種方式
1. 通過Object類的getClass方法來獲取
java.lang.Object中定義有getClass方法:public final Class getClass()
所有Java對象都具備這個方法,該方法用於返回調用該方法的對象的所屬類關聯的Class對象,例如:
Date date1 = new Date();
Date date2 = new Date();
Class c1 = date1.getClass();
Class c2 = date2.getClass();
System.out.println(c1.getName());
// java.util.Date
System.out.println(c1 == c2);
// true
上面的代碼中,調用Date對象date1的getClass方法將返回用於封裝Date類信息的Class對象。
這里調用了Class類的getName方法:public String getName(),這個方法的含義很直觀,即返回所封裝的類的名稱。
需要注意的是,代碼中的date1和date2的getClass方法返回了相同的Class對象(c1==c2的值為true)。這是因為,對於相同的類,JVM只會載入一次,而與該類對應的Class對象也只會存在一個,無論該類實例化了多少對象。
另外,需要強調的是,當一個對象被其父類的引用或其實現的介面類型的引用所指向時,getClass方法返回的是與對象實際所屬類關聯的Class對象。例如:
List list = new ArrayList();
System.out.println(list.getClass().getName()); // java.util.ArrayList
上面的代碼中,語句list.getClass()方法返回的是list所指向對象實際所屬類java.util.ArrayList對應的 Class對象而並未java.util.List所對應的Class對象。有些時候可以通過這個方法了解一個對象的運行時類型,例如:
HashSet set = new HashSet();
Iterator it = set.iterator();
System.out.println(it.getClass().getName()); //java.util.HashMap$KeyIterator
從代碼可以看出,HashSet的iterator方法返回的是實現了Iterator介面的HashMap內部類(KeyIterator)對象。
因為抽象類和介面不可能實例化對象,因此不能通過Object的getClass方法獲得與抽象類和介面關聯的Class對象。
2. 使用.class的方式
使用類名加「.class」的方式即會返回與該類對應的Class對象。例如:
Class clazz = String.class;
System.out.println(clazz.getName()); // java.lang.String
這個方法可以直接獲得與指定類關聯的Class對象,而並不需要有該類的對象存在。
3. 使用Class.forName方法
Class有一個著名的static方法forName:public static Class forName(String className) throws ClassNotFoundException
該方法可以根據字元串參數所指定的類名獲取與該類關聯的Class對象。如果該類還沒有被裝入,該方法會將該類裝入JVM。
該方法聲明拋出ClassNotFoundException異常。顧名思義,當該方法無法獲取需要裝入的類時(例如,在當前類路徑中不存在這個類),就會拋出這個異常。
例如,如果當前類路徑中存在Foo類:
package org.whatisjava.reflect;
public class Foo {
public Foo() {
System.out.println("Foo()");
}
static {
System.out.println("Foo is initialized");
}
}
運行下面的代碼:
Class clazz = Class.forName("org.whatisjava.reflect.Foo");
控制台會有如下輸出:
Foo is initialized
Class.forName("org.whatisjava.reflect.Foo")首先會將reflection.Foo類裝入JVM,並返回與之關聯的Class對象。JVM裝入Foo類後對其進行初始化,調用了其static塊中的代碼。需要注意的是:forName方法的參數是類的完 整限定名(即包含包名)。
區別於前面兩種獲取Class對象的方法:使用Class.forName方法所要獲取的與之對應的Class對象的類可以通過字元串的方式給定。該方法通常用於在程序運行時根據類名動態的載入該類並獲得與之對應的Class對象。
通過上面的文章相信你對java的反射機制有了一定的認識,同時也對java中Class類的用法有了比較清晰的理解,在我們實際工作的過程中,我們不斷的運用java知識來解決實際生活中的問題的時候我們就能對java反射機制有一個更深入的理解!
㈧ java的反射機制是什麼
反射技術:其實就是動態載入一個指定的類,並獲取該類中的所有的內容。並將位元組碼文件中的內容都封裝成對象,這樣便於操作這些成員。簡單說:反射技術可以對一個類進行解剖。
反射的好處:大大的增強了程序的擴展性。
反射的基本步驟:
1、獲得Class對象,就是獲取到指定的名稱的位元組碼文件對象。
2、實例化對象,獲得類的屬性、方法或構造函數。
3、訪問屬性、調用方法、調用構造函數創建對象。
㈨ java 反射有什麼用
反射就是把java類中的各種成分映射成為相應的java類。例如:一個java類用一個Class類的對象來表示,一個類中的組成部分:成員變數、方法、構造函數、包等等信息也用一個個java類來表示,就像汽車是一個類,汽車中的發動機,變速箱等等也是一個個的java類,表示java類的Class類顯然要提供一系列的方法,來獲得其中的變數,方法,構造函數,修飾符,包等信息,這些信息就是用相應類的實例對象來表示,它們是Field、Method、Constructor、Package等等
在平時的編程中,反射基本用不到,但是在編寫框架的時候,反射用的就多了,比如你要使用某一個類進行操作,但是這個類是用戶通過配置文件配置進來的,你需要先讀配置文件,然後拿到這個類的全類名:比如com.onede4..Person,然後在利用反射API來做操作
㈩ JAVA-什麼是反射,請問大白話,解釋一下
通過Java的類文件就可以獲得類裡面的所有內容並運行起來,包括欄位,構造方法,一般方法,比如告訴我一個類文件位置,我就能通過反射機制創建該類的對象,並運行該類的方法,框架用的比較多。簡單的一個應用,例如寫好了一個程序,再給他弄一個配置文件,配置文件裡面保存著類文件的地址名稱,這時我只要改配置文件不需要動源程序,就能達到執行不同類的效果。