『壹』 大佬告訴我java 反射如何獲取成員變數的值
下例演示了通過反射獲取 Test 類對象 t 的 iVal, strVal 成員變數的值:
importjava.lang.reflect.Field;
classTest{
privateintiVal;
privateStringstrVal;
publicTest(intiVal,StringstrVal){
this.iVal=iVal;
this.strVal=strVal;
}
}
publicclassApp{
publicstaticvoidmain(String[]args){
//創建一個Test對象
Testt=newTest(123,"Hello");
//獲取對象t的Class
Class<?>tt=t.getClass();
try{
//獲取Test類的iVal欄位Field
Fieldfield=tt.getDeclaredField("iVal");
//設置可訪問
field.setAccessible(true);
//獲取iVal的值
intval=field.getInt(t);
System.out.println(val);
FieldstrValField=tt.getDeclaredField("strVal");
strValField.setAccessible(true);
StringstrVal=(String)strValField.get(t);
System.out.println(strVal);
}catch(NoSuchFieldException|SecurityExceptione){
e.printStackTrace();
}catch(IllegalArgumentExceptione){
e.printStackTrace();
}catch(IllegalAccessExceptione){
e.printStackTrace();
}
}
}
『貳』 用java的反射機制怎麼獲取一個類中裡面方法中局部變數
publicclassPerson{
privateStringname;
privateintage;
publicStringgetName(){
returnname;
}
publicvoidsetName(Stringname){
this.name=name;
}
publicintgetAge(){
returnage;
}
publicvoidsetAge(intage){
this.age=age;
}
publicstaticvoidmain(String[]args){
try{
Classc=Class.forName(Person.class.getName());
//獲取類的屬性
Field[]fields=c.getDeclaredFields();
for(inti=0;i<fields.length;i++){
System.out.println("類的屬性有:"+Modifier.toString(fields[i].getModifiers())+""+fields[i].getType()+""+fields[i].getName());
}
//獲取類的方法
Method[]methods=c.getMethods();
for(intj=0;j<methods.length;j++){
System.out.println("類的方法有:"+Modifier.toString(methods[j].getModifiers())+""+methods[j].getReturnType()+""+methods[j].getName());
}
}catch(ClassNotFoundExceptione){
e.printStackTrace();
}
}
}
//運行結果如下:
類的屬性有:privateclassjava.lang.Stringname
類的屬性有:privateintage
類的方法有:publicstaticvoidmain
類的方法有:publicclassjava.lang.StringgetName
類的方法有:publicvoidsetName
類的方法有:publicvoidsetAge
類的方法有:publicintgetAge
類的方法有:publicfinalvoidwait
類的方法有:publicfinalvoidwait
類的方法有:publicfinalnativevoidwait
類的方法有:publicbooleanequals
類的方法有:publicclassjava.lang.StringtoString
類的方法有:publicnativeinthashCode
類的方法有:publicfinalnativeclassjava.lang.ClassgetClass
類的方法有:publicfinalnativevoidnotify
類的方法有:
『叄』 如何利用java反射順序的從一個java類中得到其中定義的成員變數名或者方法
for (int i = 0; i < fields.length; i++) {
Field field = fields[i];
String fieldName = field.getName();
System.out.println("name====="+fieldName);
String firstLetter = fieldName.substring(0, 1).toUpperCase();
// 獲得和屬性對應的getXXX()方法的名字
String getMethodName = "get" + firstLetter + fieldName.substring(1);
// 獲得和屬性對應的getXXX()方法
Method getMethod = classType.getMethod(getMethodName, new Class[]{});
// 調用原對象的getXXX()方法
Object value = getMethod.invoke(object, new Object[]{});
System.out.println("value===="+value);
}
『肆』 java如何利用反射機製得到一個類中為數組類型的成員變數的值
寫了個例子,請仔細查看代碼,具體過程需要你自己對照java API 再研究,
先定義了一個普通的學生類,如下:
publicclassStudent{
privateintid;
privateStringname;
privateintage;
privateString[]aiHao;
publicintgetId(){
returnid;
}
publicvoidsetId(intid){
this.id=id;
}
publicStringgetName(){
returnname;
}
publicvoidsetName(Stringname){
this.name=name;
}
publicintgetAge(){
returnage;
}
publicvoidsetAge(intage){
this.age=age;
}
publicString[]getAiHao(){
returnaiHao;
}
publicvoidsetAiHao(String[]aiHao){
this.aiHao=aiHao;
}
}
對學生類進行反射
publicclassTest3{
publicstaticvoidmain(String[]args){
Students=newStudent();
s.setId(1);
s.setName("張三");
s.setAge(23);
s.setAiHao(newString[]{"足球","籃球","上網"});
try{
//獲取所有的變數
Field[]fields=Student.class.getDeclaredFields();
//循環處理變數
for(Fieldf:fields){
f.setAccessible(true);
Objectvalue=f.get(s);//取變數的值
System.out.print("變數名稱為:"+f.getName());
if(value.getClass().isArray()){//判斷是否是數組
Object[]arr=(Object[])value;//裝換成數組
System.out.println(",變數值等於:"+Arrays.toString(arr));
//這里還可以做額外處理,判斷數組的類型如下面注釋的代碼
/*
for(Objecta:arr){
System.out.println("參數類型"+a.getClass().getName());
//同樣運用反射的機製做額外處理
}
*/
}else{
//非數組類型,普通處理
System.out.println(",變數值等於:"+value);
}
f.setAccessible(false);
}
}catch(Exceptione){
e.printStackTrace();
}
}
}
『伍』 在JAVA中,怎麼利用反射獲取一個方法
java的反射用法:(異常請自行處理)
①找到類:Class cl = Class.forName("java.util.Date");
②創建對象(要求這個類中含有空參數的構造方法):Object obj = cl.newInstence();
③根據名稱和參數找方法:Method method1 = cl.getMethod("getTime");//如果沒有參數不用寫第二個參數如果有參數的如:Method method2 = cl.getMethod("setTime",long.class);
④在某個對象上面執行方法,Object result = method1.invoke(obj);//如果有參數的Object result = method2.invoke(obj,21317362721);
執行的方如果有返回值,將返回值返回,否則返回null