Ⅰ java反射提基本類型
"""
Method m = c.getMethod("setName", new Class[]{Class.forName("java.lang.String")});
"""
這里可以用Method m = c.getMethod("setName", java.lang.String.class);簡單一些,因為它本身是一個可變參數列表;一個class不是需要Class.forName("java.lang.String")這么復雜的,這個還要用反射,相當不好。
而基本類型也是可以用的
如m = c.getMethod("setAge", int.class);
希望對你有幫助,一天一回答送給你了。
Ⅱ 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反射
Class 類的實例表示正在運行的 Java 應用程序中的類和介面。枚舉是一種類,注釋是一種介面。每個數組屬於被映射為 Class 對象的一個類,所有具有相同元素類型和維數的數組都共享該 Class 對象。基本的 Java 類型(boolean、byte、char、short、int、long、float 和 double)和關鍵字 void 也表示為 Class 對象。
Class 沒有公共構造方法。Class 對象是在載入類時由 Java 虛擬機以及通過調用類載入器中的 defineClass 方法自動構造的。
以下示例使用 Class 對象來顯示對象的類名:
void printClassName(Object obj) {
System.out.println("The class of " + obj +
" is " + obj.getClass().getName());
}
還可以使用一個類字面值來獲得命名類型(或 void)的 Class 對象。例如:
System.out.println("The name of class Foo is: "+Foo.class.getName());
Ⅳ 說說對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反射怎麼實現的
Java中反射有如下幾種實現方式:
1、通過Class.forName()方法載入字元串,就可以得到該字元串做代表的Class對象。
2、通過類名調用class屬性得到該類的Class對象。
例如:Class<?> clazz = String.class也可以得到String類的Class對象。
3、調用實例的getClass()方法。
例如:Date date = new Date();
Class<?> clazz = date.getClass();
通過上邊的兩句代碼就可以得到date實例的Class對象。
Ⅷ 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反射技術執行一個類的方法
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反射應用有哪些
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