① 說說對java反射的理解,使用反射如何獲取一個類的所有方法,使用反射需要注意哪些問題
反射說白了就是可以獲得一個類的所有信息,主要包括方法和屬性兩部分。
1.獲得方法包括獲得方法的名稱,方法的返回類型,方法的訪問修飾符,以及通過反射執行這個方法。
2.獲得屬性包括屬性的名稱,類型,訪問修飾符,以及這個屬性的值。
這些獲得都有相應的API提供操作。
舉個例子:
先定義一個類,有age這個屬性,以及age的get和set方法:
public class TestRflectionFather {
public int age =32;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
然後操作獲得所有方法:
import java.lang.reflect.Method;
public class Testmain {
public static void main(String[] args) throws Exception {
Class clazz = Class.forName("TestRflectionFather");
Method[] methods =clazz.getDeclaredMethods();
for(Method me:methods)
{
System.out.println(me.getName());
}
}
}
//最後輸出
getAge
setAge
② java反射最常用的幾個方法
下面給你介紹Java反射常用的2種方法:
獲取javaBean的屬性
③ 利用JAVA反射技術執行一個類的方法
package cn;
import java.lang.reflect.*;
public class SimpleClassDesc {
/**
* @param args
*/
public static void main(String[] args) {
Class type=null;
try
{
System.out.println(args[0]);
type=Class.forName(args[0]);
}catch(Exception e)
{
e.printStackTrace();
}
Class superClass=type.getSuperclass();
if(superClass!=null)
{
System.out.println("extends "+superClass.getCanonicalName());
}
Method[] methods=type.getDeclaredMethods();
for(int i=0;i<methods.length;i++)
{
if(Modifier.isPublic(methods[i].getModifiers()))
{
System.out.println(""+methods[i]);
}
}
}
}
利用java反射機制列印出給定類的直接超類,並列出它所聲明的public方法。
④ java反射,調用private的方法
soeasy
Stringpath=「com.test.B」
Classclazz=Class.forName(path);//獲得b的反射
Bb=(B)clazz.newInstance();//前提是b類有個無參構造函數
Methodm=clazz.getDeclaredMehod("SetName",String.class);
m.setAccessible(true);//不做安全檢查,你才可以去訪問私有方法
m.invoke(b,"哈哈");
這里是給B裡面的(下面這個方法進行調用賦值)
privatevoidSetName(Strings){}
psgetDeclaredMehod是對私有的方法進行調用要訪問必須加setAccessible
getMehod是對通用方法進行調用,不用加setAccessible
⑤ java反射應用有哪些
Reflection(反射) 是 Java 程序開發語言的特徵之一,它允許運行中(注意是運行時,而非編譯時)的 Java 程序對自身進行檢查,或者說「自審」,並能直接操作程序的內部屬性。例如,使用它能獲得 Java 類中各成員的名稱並顯示出來,能夠通過字元串形式的類名稱(包括完整包名)反射性地創建類的實例,能夠動態執行類方法等。JavaBean 是 reflection 的實際應用之一,它能讓一些工具可視化的操作軟體組件。這些工具通過 reflection 動態的載入並取得 Java 組件(類) 的屬性。Java反射是動態程序設計的基礎。Java語言反射提供一種動態鏈接程序組件的多功能方法。它允許程序創建和控制任何類的對象,無需提前硬編碼目標類。這些特性使得反射特別適用於創建以非常普通的方式與對象協作的庫。Java reflection 非常有用,它使類和數據結構能按名稱動態檢索相關信息,並允許在運行著的程序中操作這些信息。Java 的這一特性非常強大,並且是其它一些常用語言,如 C、C++、Fortran 或者 Pascal 等都不具備的。 但反射有兩個缺點。第一個是性能問題。用於欄位和方法接入時反射要遠慢於直接代碼。性能問題的程度取決於程序中是如何使用反射的。如果它作為程序運行中相對很少涉及的部分,緩慢的性能將不會是一個問題。即使測試中最壞情況下的計時圖顯示的反射操作只耗用幾微秒。僅反射在性能關鍵的應用的核心邏輯中使用時性能問題才變得至關重要。 我最近使用反射寫了一個Pojo(實體)基類,你可以到我的Csdn博客上查閱該常式。文章地址為: http://blog.csdn.net/CodingMouse/archive/2009/04/11/4064007.aspx
⑥ java反射問題
一個標準的javabean類所有欄位都是私有的.然後提供該欄位的GET,SET.這個是前提!1.該欄位的SET方法有可能加了攔截代碼.有些值不賦進去.例如你做一個注冊.要填性別的時候就只能填男女.其他不能填的就會用攔截代碼攔截掉.2.如果你用反射,就有方法直接訪問那個欄位,無論那欄位是否私有.賦值的時候用的是JAVA反射包里Field類(java.lang.reflect.Field)里提供的SET方法其實就相當於直接賦值.不用經過其他攔截代碼.即不用經類本身欄位的SET方法3.反射的意義體現了它能對項目的曠展性上.例如你要實例化一個業務類.普通:Demod=newDemo();------------------------------------反射:Demod=Class.forName(`類全名`);//可以直接通過類名就實例化一個對象,不用直接NEW//而類名可以寫在配置文件上面.用IO.讀進來用就可以了.//這樣寫得話,到時候要升級業務需求的時候,要換一個實現類,就不用其他改動源碼,把新寫好的業類類全名直接寫在配置文件上就可以了
⑦ 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異常。顧名思義,當該方法無法獲取需要裝入的類時(例如,在當前類路徑中不存在這個類),就會拋出這個異常。
⑧ java反射方法調用問題
int是基本類型沒錯,因此,在用反射調用時,應明確使用Integer才行。
由於參數是從資料庫里來的(ResultSet),因此,要看資料庫的定義,以及資料庫的類型。
比如,對於Oracle 定義的任何數值類型欄位,都會返回Decimal對象,由於float類型能運行,推斷應該不使用的ORACLE,還是看你的資料庫定義吧,實在不行,就要做下面的工作,增加一個TypeConvertor定義,其中實現將資料庫返回的對象轉換成方法參數所需的類型,針對幾種基本數據類型進行簡單的轉換,就不需要依賴資料庫了。
1樓的是想自己做持久類框架??
⑨ 什麼是反射什麼Java反射
java反射是什麼意思呢?下面帶大家了解一下。
JAVA反射是指程序可以訪問、檢測和修改它本身狀態或行為的一種能力。反射是一種強大的工具,能夠創建靈活的代碼,可以使代碼在運行時裝配,無需在組件之間進行源代表鏈接。
JAVA反射機制是在運行狀態中,知道所有屬性和方法,對於任意一個對象,能夠調用它的方法和屬性,這種動態獲取的信息以及動態調用對象的方法的功能的反射機制。
反射適合用在哪
首先我們先思考一個問題,反射適合使用在哪裡呢?從功能上看,反射似乎無所不能,幾乎所有的類,所有的屬性、方法、構造我們都能使用,但是我們細細思考一下,在實際開發中,並不是所有場景都需要使用反射獲取屬性或者方法進行操作,反而更多的使用實例.xxx方式操作,而當這些操作重復次數較多的時候,我們往往會考慮優化代碼,減少代碼冗餘,提高復用,比如實體構建賦值等操作,這個時候往往是我們最需要復用的地方,所以我們可以大體認為反射主要使用在實體操作過程中。而在一般操作數據的過程中,我們的實體一般都是知道並且依賴於對應的數據類型的,比如:
1.根據類型new的方式創建對象
2.根據類型定義變數,類型可能是基本類型也可能是引用類型、類或者介面
3.將對應類型的對象傳遞給方法
4.根據類型訪問對象的屬性,調用方法等操作
以上這些操作都是數據操作的過程中最常見也是最難復用優化的地方,而如果這里的操作使用反射則可以實現動態的操作不同的類型的實例,通過調用反射入口類Class,獲取對應的屬性、構造、方法完成對應的操作