Java反射機制demo(五)—獲得並呼叫一個類中的方法

weixin_33686714發表於2017-08-23

這個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,intthrows java.lang.InterruptedException
public final native void java.lang.Object.wait(longthrows 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方法:
影魔

  

  

  

 

相關文章