㈠ 說說對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反射調用屬性的set方法時,若屬性為int類型,會出錯,設置通過get得到的值的getClass為Integer。
Integer可以直接轉成int的啊,int是基本類型,去不是繼承於object,而integer是類才能用getclass方法。獲得之後能夠轉成int型
㈢ Java如何獲得一個對象中所有帶set方法的欄位(形成Field對象)包括父類的。有現成的工具類
在Java中 是獲取不了對象裡面的欄位的(除非是一些固定寫死的欄位) ,但是可以利用反射獲取set方法,進行賦值
具體可以參考一下代碼
/**
*
* @param obj 賦值對象
* @param value 賦值的值
* @throws Exception
*/
public void setMethod(Object obj ,String value) throws Exception{
if (obj == null ) {
return;
}
Method[] methods = obj.getClass().getMethods();
for (int i = 0; i < methods.length; i++) {
Method method = methods[i];
String name = method.getName();
if(name.contains("set")){
method.invoke(obj,value);
}
}
}
㈣ java中的反射,invoke方法詳解
就是調用類中的方法,最簡單的用法是可以把方法參數化,invoke(class, method)比如你Test類里有一系列名字相似的方法setValue1、setValue2等等。可以把方法名存進數組v[],然後循環里invoke(test,v[i]),就順序調用了全部setValue
如:publicclass MyTest{publicstaticvoidmain(String[]args) {String[]names={"tom","tim","allen","alice"};
Class<?>clazz=Test.class;try Methodmethod=clazz.getMethod("sayHi",String.class);for(Stringname:names)method.invoke(clazz.newInstance(),name);}catch(NoSuchMethodExceptione)e.printStackTrace();}catch(IllegalAccessExceptie.printStackTrace(}catch(IllegalArgumentException{e.printStackTrace();}catch(InvocationTargetExceptione)e.printStackTrace();}catch(InstantiationExceptione{e.printStackTrace(}classTest{publicvoidsayHi(Stringname){System.out.println("Hi"+name);}
㈤ JAVA從資料庫查出來的數據放到實體類想用反射的方法給他們賦值,怎麼做
說一個大概思路吧:
1.讀取數據:從資料庫中讀取數據的同時,拿到元數據,即metadata;
2.實例化:通過類名,利用反射 實例你的實體類(類名可以和表名保持一致,這樣就不用寫額外的
映射了),如果你只是想通過反射賦值的話,你也可以直接new個類;
3.方法調用:通過元數據,利用反射 得到你的set方法(方法名可以和欄位名保持一致,否則你要寫
出映射關系);
㈥ java中, 怎麼調用別的類的私有方法
利用反射即可調用;
簡易實例代碼如下:
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
/**
* @author thomaslwq
* @version 創建時間:Sep 4, 2012 9:53:49 PM
* 類說明
*/
public class ReflectionTest {
public static void setObjectColor(Object obj) throws SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAcces***ception, InvocationTargetException{
Class cls = obj.getClass();
//獲得類的私有方法
Method method = cls.getDeclaredMethod("privateMethod", null);
method.setAccessible(true); //沒有設置就會報錯
//調用該方法
method.invoke(obj, null);
}
public static void main(String args[]) throws SecurityException, IllegalArgumentException, NoSuchMethodException, IllegalAcces***ception, InvocationTargetException{
setObjectColor(new MyTest());
}
}
//測試類
class MyTest{
public void setMyTest(){
System.out.println("setMyTest");
}
/**
類的私有方法
**/
private void privateMethod(){
System.out.println("調用了 private Method");
}
}
㈦ java反射機制可以調用到私有方法,是不是就破壞了JAVA的卦裝性呢。
這是一個很值得探討的問題,許多人接觸反射時,對反射功能之強大都會抱有懷疑,感覺嚴重破壞了封裝的性質。可是,什麼是封裝,什麼是安全呢?
封裝,是將具體的實現細節隱藏,而把功能作為整體提供給類的外部使用,也就是說,公有方法能夠完成類所具有的功能。當別人使用這個類時,如果通過反射直接調用私有方法,可能根本實現不了類的功能,甚至可能會出錯,因此通過反射調用私有方法可以說是沒有任何用處的,開發人員沒有必要故意去破壞封裝好的類。從這點上看,封裝性並沒有被破壞。
所謂安全,如果意思是保護實現源碼不被別人看見,那沒有作用。不用反射也能輕易獲取源碼。
所以我以為反射機制只是提供了一種強大的功能,使得開發者能在封裝之外,按照特定的需要實現一些功能。就好比核技術,雖然造核彈很危險吧,但造核電站還是很有用處的(這個比喻似乎不是很恰當,將就將就)。
曾經給朋友討論過這個問題,感覺解釋得不是很清楚,大家一起探討探討,看看怎樣表述才能更容易理解:)
㈧ 調用一個javabean實例的屬性都有哪些方式
JavaBean 是一種普遍應用的 Java 類型,它定義了一個標準的Java類來承載和封裝數據。可以調用 JavaBean 實例的屬性有以下幾種方式:
使用公共的 getter 和 setter 方法:實現一個包含 get/set 方法和無參構造函數的JavaBean類,在程序中使用 getter 和 setter 方法分別獲取和設置JavaBean實例的單個屬性。
通過反射 API 調用屬性: 可以使用 Java 的反射機制獲取和設置對象實例的內部屬性,通過反射也能夠修改 private類型的屬性。
直接訪問公共的屬性變數:如果 JavaBean 中的屬性使用 public 特性標識, 則可以像普通變數那樣直接訪問 JavaBean 實例的屬性。
JSON 數據綁定:JavaBean可以使用JSON序列化/反序列化技術將JavaBean類映射到 JSON 對象中,從而獲取或操作JavaBean實例的屬性。
下面是一些示例代碼片段,展示如何使用這些不同方式訪問JavaBean實例的屬性:
通過 getter 和 setter 方法:
通過反射 API 調用 JavaBean 的屬性:
直接訪問公共的屬性變數:
使用 JSON 數據綁定:
總之,以上這些方式並不是完整的JavaBean實例屬性的訪問方式,需要根據具體場景和實際要求進行選擇。