為什么我后面得訪問方法輸出不了????加粗那段
package com.imooc;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class Main_02 {
public static void main(String[] args) {
Example_02 ex = new Example_02();
Class c = ex.getClass();
Field[] fd = c.getDeclaredFields();
for(int i=0;i<fd.length;i++){
Field field = fd[i]; //歷遍成員變量
//獲得成員名稱
System.out.println("成員名稱:"+field.getName());
Class fieldType = field.getType(); //獲得成員變量類型
System.out.println("成員變量類型:"+fieldType);
boolean isTurn = true;
while(isTurn){
try {
isTurn = false;
System.out.println("修改值前為:"+field.get(ex));
if(fieldType.equals(int.class)){
System.out.println("利用方法setint()修改成員變量的值");
field.setInt(ex, 168);
}else if(fieldType.equals(float.class)){
System.out.println("利用setFloat()修改成員變量得值");
field.setFloat(ex, 99.9F);
}else if(fieldType.equals(boolean.class)){
System.out.println("利用setBoolean()修改成員變量得值");
field.setBoolean(ex,true);
}else if(field.equals(String.class)){
System.out.println("用set()方法修改成員變量得值");
field.set(ex,"MWQ");
}else{
System.out.println("用set()方法修改成員變量得值");
field.set(ex,"RSF");
}
System.out.println("修改值后得成員變量"+field.get(ex));
}?
catch (Exception e) {
System.out.println("在設(shè)置成員變量時(shí)拋出異常,"+"下面執(zhí)行setAccessible()方法");
field.setAccessible(true);
isTurn = true;
}
}
System.out.println();
}
Method[] dm = c.getDeclaredMethods();
for(int i=0;i<dm.length;i++){
Method m = dm[i];
System.out.println("名稱為:"+m.getName());
System.out.println("是否允許帶有可變數(shù)量得參數(shù):"+m.isVarArgs());
System.out.println("入口參數(shù)類型為:");
Class[] pt = m.getParameterTypes();
for(int j=0;j<pt.length;j++){
System.out.println(""+pt[j]);
}
System.out.println("返回值類型為:"+m.getReturnType());
System.out.println("可能拋出得異常類型有:");
Class[] et = m.getExceptionTypes();
for(int j=0;j<et.length;j++){
System.out.println(""+et[j]);
}
boolean isTurn = true;
while(isTurn){
try{
isTurn = false;
if("staticMethod".equals(m.getName()))
m.invoke(ex);
else if("publicMethod".equals(m.getName()))
System.out.println("返回值為:"+m.invoke(ex, 168));
else if("privateMethod".equals(m.getName()))
System.out.println("返回值為:"+m.invoke(ex,"5",7));
else if("privateMethod".equals(m.getName())){
Object[] o = new Object[]{new String[]{"Q","W","E"}};
//上面定義二維數(shù)組
System.out.println("返回類型:"+m.invoke(ex, o));
}
}catch (Exception e) {
System.out.println("在執(zhí)行方法時(shí)可能拋出異常,所以下面執(zhí)行setAccessible()方法");
m.setAccessible(true); //設(shè)置允許訪問
isTurn = true;
}
}
System.out.println();
}
}
}
2018-07-23
一體式的代碼太繁瑣了,
所以我把兩個(gè)方法重構(gòu)了,
改了一點(diǎn)點(diǎn),
除了那個(gè)二維數(shù)組沒看懂,其他的都可以運(yùn)行,
二維數(shù)組那個(gè)方法請(qǐng)發(fā)一下,
不然無法理解,不知道方法體
2018-07-23
import java.lang.reflect.*;

public class Main_02 {
public static void getParameter(Object ex){
Class c = ex.getClass();
Field[] fd = c.getDeclaredFields();
for(int i=0;i<fd.length;i++){
Field field = fd[i];
System.out.println("成員名稱:"+field.getName());
Class fieldType = field.getType();
System.out.println("成員變量類型:"+fieldType);
System.out.println();
}
}
public static void getMethods(Object ex){
Class c=ex.getClass();
Method[] dm = c.getDeclaredMethods();
for(int i=0;i<dm.length;i++){
Method m = dm[i];
System.out.println("方法"+(i+1)+"名稱為:"+m.getName());
System.out.println("是否允許帶有可變數(shù)量得參數(shù):"+m.isVarArgs());
System.out.print("入口參數(shù)類型為:");
Type[] pt = m.getParameterTypes();
for(int j=0;j<pt.length;j++){
System.out.print(pt[j]+",");
}
System.out.println("\n返回值類型為:"+m.getReturnType());
System.out.print("可能拋出得異常類型有:");
Type[] et = m.getGenericExceptionTypes();
for(int j=0;j<et.length;j++){
System.out.print(et[j]+",");
}
System.out.println();
while(true){
try{
System.out.print("執(zhí)行結(jié)果:");
if("staticMethod".equals(m.getName()))
m.invoke(ex);
else if("publicMethod".equals(m.getName()))
System.out.print("返回值為:"+m.invoke(ex, 168));
else if("privateMethod".equals(m.getName()))
System.out.print("返回值為:"+m.invoke(ex,"5",7));
System.out.println("(無異常。)");
}catch(IllegalAccessException E){
System.out.println("在執(zhí)行方法時(shí)拋出訪問權(quán)限異常,所以下面執(zhí)行setAccessible()方法");
m.setAccessible(true);
continue;
}catch (Exception e) {
System.out.println(e.getMessage());
}
System.out.println();
break;
}
}
}
public static void main(String[] args) {
Example_02 ex = new Example_02();
System.out.println("**********常量列表**********");
Main_02.getParameter(ex);
System.out.println("**********方法列表**********");
Main_02.getMethods(ex);
}
}