Java反射机制demo(五)—获得并调用一个类中的方法

这个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方法:
影魔

  

  

  

 

转载于:https://www.cnblogs.com/telwanggs/p/7418883.html

你可能感兴趣的:(Java反射机制demo(五)—获得并调用一个类中的方法)