Ⅰ 用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如何利用反射機製得到一個類中為數組類型的成員變數的值
寫了個例子,請仔細查看代碼,具體過程需要你自己對照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 通過反射怎麼獲取方法中參數值
public <T> T invokeMethod(String beanName, String methodName,
Class<?>[] paramTypes, Object... parameters) {
try {
Object bean = ApplicationContextHolder.getBean(beanName);
Class<? extends Object> beanClass = bean.getClass();
// Method method = beanClass.getDeclaredMethod(methodName,
// paramTypes);
// Method m0 = ClassUtils.getPublicMethod(beanClass, beanName,
// paramTypes);
Method method = null;
Method[] ms = beanClass.getMethods();
for (Method m : ms) {
String mName = m.getName();
if (StringUtils.equals(methodName, mName)) {
boolean isThis = true;
Class<?>[] pt = m.getParameterTypes();
if (paramTypes.length == pt.length) {
int plength = paramTypes.length;
if (plength == 0) {
isThis = true;
} else {
for (int i = 0; i < plength; i++) {
boolean ff = pt[i]
.isAssignableFrom(paramTypes[i]);
if (!ff) {
isThis = false;
break;
}
}
}
} else {
isThis = false;
}
if (isThis) {
method = m;
break;
}
}
}
if (method == null) {
throw new NoSuchMethodException(beanName + "." + methodName);
}
Object obj = null;
if (parameters == null || parameters.length < 1) {
obj = method.invoke(bean);
} else {
obj = method.invoke(bean, parameters);
}
T out = (T) obj;
return out;
} catch (SecurityException e) {
log.error(DataTypeConstant.MOD_CODE_SUBTYPE2, "", e);
} catch (IllegalArgumentException e) {
log.error(DataTypeConstant.MOD_CODE_SUBTYPE2, "", e);
} catch (IllegalAccessException e) {
log.error(DataTypeConstant.MOD_CODE_SUBTYPE2, "", e);
} catch (InvocationTargetException e) {
log.error(DataTypeConstant.MOD_CODE_SUBTYPE2, "", e);
} catch (NoSuchMethodException e) {
log.error(DataTypeConstant.MOD_CODE_SUBTYPE2, "", e);
}
return null;
}
上面是一個完整的通過bean的名稱和方法名稱來調用該bean下的一個方法的方法。應該對你有所幫助!
Ⅳ java 通過反射怎麼獲取方法中參數值
答案是沒法獲取。
首先反射獲取的是類、屬性、或者方法的定義,就拿方法來說,方法的定義是什麼呢?
方法的定義包括:方法名,方法的參數類型列表,方法的返回值類型。
方法的參數類型列表包括什麼呢?
包括每個參數的順序和參數類型。
參數值是什麼?是在這個方法被調用的時候傳入的參數叫做參數值。反射呢,是獲取的它的定義,並不牽扯調用,所以說沒法獲取。
Ⅵ 反射--靜態成員變數的值獲取
public class Student{
private static int age;
}
Field field = Student.class.getDeclaredField("age");
field.setAccessible(true);
field.get(null); 普通屬性獲取值 需要傳入對象,但是靜態屬性 不需要傳入具體對象,傳
null 也可以獲取 該欄位的值。
Ⅶ 大佬告訴我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 通過反射怎麼獲取方法中參數值
Class<?>clazz=object.getClass();
Method[]ms=clazz.getMethods();
for(inti=0;i<ms.length;i++){
System.out.println("方法名:"+ms[i].getName());
Type[]t=ms[i].getGenericParameterTypes();//獲取參數類型,至於你說的獲取參數值,我沒明白
}
Ⅸ java 通過反射怎麼獲取方法中參數值
id只是形參,調用函數的時候傳進去的才是實參
也就是你使用這個函數傳進去的具體的值,這是你自己傳進去的