Java反射機制demo(五)—獲得並調用一個類中的方法
阿新 • • 發佈:2017-08-23
color 擁有 oca logs over super getmethod equals() bool
這個demo在使用反射機制操作屬性之前,主要原因是因為在.class文件字節碼中,方法排在屬性的前面。
1,獲得一個類中的方法
先看一下方法和運行結果。獲取所有的方法使用Class類中getMethos()方法。
待獲取的類:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
package com.aaron.reflect;
public class Heros {
private String name; //名字
private String type; //類型
private int camp; //0,近衛;1,天災
public Heros(){}
public Heros(String name, String type, int camp) {
super ();
this .name = name;
this .type = type; this .camp = camp;
}
public String getName() {
return name;
}
public void setName(String name) {
this .name = name;
}
public String getType() {
return type;
}
public void setType(String type) {
this .type = type; }
public int getCamp() {
return camp;
}
public void setCamp( int camp) {
this .camp = camp;
}
@Override
public String toString() {
return "Heros [\n name=" + name + ", \n type=" + type + ", \n camp=" + camp + "\n]" ;
}
}
|
Hero類中包含了三個屬性,和對應的getter和setter方法。另外還有一個toString方法。這是一個非常常見的pojo。
測試類:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
package com.aaron.reflect;
import java.lang.reflect.Method;
public class Demo5 {
public static void main(String[] args) {
Class<?> herosClass = Heros. class ;
Method[] methods = herosClass.getMethods();
for (Method method : methods) {
System.out.println(method);
}
}
}
|
理論上,我們會獲得所有的getter和setter,然後還有toString方法
運行結果:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
public void com.aaron.reflect.Heros.setType(java.lang.String)
public int com.aaron.reflect.Heros.getCamp()
public void com.aaron.reflect.Heros.setCamp( int )
public java.lang.String com.aaron.reflect.Heros.toString()
public java.lang.String com.aaron.reflect.Heros.getName()
public void com.aaron.reflect.Heros.setName(java.lang.String)
public java.lang.String com.aaron.reflect.Heros.getType()
public final void java.lang.Object.wait( long , int ) throws java.lang.InterruptedException
public final native void java.lang.Object.wait( long ) throws java.lang.InterruptedException
public final void java.lang.Object.wait() throws java.lang.InterruptedException
public boolean java.lang.Object.equals(java.lang.Object)
public native int java.lang.Object.hashCode()
public final native java.lang.Class java.lang.Object.getClass()
public final native void java.lang.Object.notify()
public final native void java.lang.Object.notifyAll()
|
然而卻列出了這麽一大堆。
仔細看一下返回的方法,原來把Object類所擁有的方法也返回了。因為我們這個POJO類默認繼承的是java.lang.Object類。,例如getClass(),equals()這些。
使用getMethods()這個方法,返回了一個包含某些Method對象的數組,Method對象已經介紹過,用來表示一個方法的對象,是對類中方法進行抽象的結果。
這些對象反映了Class對象所表示的類或者接口,當然,包括那些由該類或者接口聲明的以及從超類和超接口繼承的那些類或接口。舉個例子來解釋一下:
例如使用getMethods()獲得Integer類的方法,會把Integer的父類,Number的所有方法,以及Number的父類Object的方法都獲取出來。
這個返回數組,包括了從Object類繼承的所有(公共)member方法。返回數組中的元素沒有排序。如果這個Class對象表示沒有公共成員方法的類或者接口,或者表示了一個基本類型或者表示void,則返回長度為0的數組。
2,調用類中的方法
直接給出一個Demo,註意參數。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
package com.aaron.reflect;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class Demo5 {
public static void main(String[] args) {
Class<?> herosClass = Heros. class ;
try {
Method m1 = herosClass.getMethod( "setName" ,String. class );
Method m2 = herosClass.getMethod( "getName" );
Object userInfo = herosClass.newInstance();
m1.invoke(userInfo, "影魔" );
System.out.println( "調用set方法:" +userInfo);
System.out.println( "調用get方法:" +m2.invoke(userInfo));
} catch (Exception e) {
e.printStackTrace();
}
}
}
|
運行結果:
1 2 3 4 5 6 7 8 |
調用set方法:
Heros [
name=影魔,
type= null ,
camp= 0
]
調用get方法:
影魔
|
Java反射機制demo(五)—獲得並調用一個類中的方法