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,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方法:

影魔

  

  

  

时间: 2024-08-01 10:42:16

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

Java反射机制demo(四)—获取一个类的父类和实现的接口

Java反射机制demo(四)—获取一个类的父类和实现的接口 1,Java反射机制得到一个类的父类 使用Class类中的getSuperClass()方法能够得到一个类的父类 如果此 Class 表示 Object 类.一个接口.一个基本类型或 void,则返回 null.如果此对象表示一个数组类,则返回表示该 Object 类的 Class 对象. 测试代码: package com.aaron.reflect; public class Demo4 { public static void

在C#中我们能调用一个类的私有方法吗

博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:在C#中我们能调用一个类的私有方法吗.

java 反射机制 Demo 练习

最近在研究java 反射机制,看网上视频,并抄了下来研究,用到Servlet 注解,绝不亚于SpringMVC 的注解使用,特此记录分享,Servlet 再也不用为传递参数而判断担忧了,专注业务! 1. 首先定义一个父类,所有的业务操作全部继承之. 1 package controller; 2 3 import java.io.IOException; 4 import java.lang.reflect.Method; 5 6 import javax.servlet.ServletExce

java反射机制之Method invoke执行调用方法例子

昨天在群里跟大家讨论了下java反射调用可变参数的问题,这个问题起因是我们需要反射调用另一个部门提供的方法,我同事说java不能反射调用可变参数的方法,于是我写了个demo证明了他这个观点的错误.但是测试过程中,有一点我不明白,就是反射调用可变参数的方法时,为什么一定要保证传入的参数数组长度为1,在群里跟大家讨论了很多,没有得到确切的答案,参照网上大牛写的东西和我自己跟源码的过程,记录如下: 1.两个类,一个父类,一个子类 [java] view plain copy print? packag

java利用反射来调用一个类的私有方法

public class Calculator2{ private int add(int a,int b){ return a+b; } } public class Test { public static void main(String[] args){ Calculator2 calculator2 = new Calculator2(); Class<Calculator2> clazz = Calculator2.class; Object result = null; try{

如何(通过反射调用一个类的私有方法)

1 public class Calcu { 2 3 private int add(int a,int b) { 4 return a+b; 5 } 6 } public class CalcuTest{ public static void main(String[] args) { Calcu ca=new Calcu(); Class<Calcu> clazz=Calcu.class; Object res=null; try { //返回一个方法对象, Method m=clazz.

python 装饰器调用其他类中的方法

场景: 做自动化是,每次都需要调用登录方法,代码重复比较多,在这种场景下,将登录功能抽取为装饰器demo class Test: data= get_yaml_date_by_fillter(filename ='warehouse_case.yaml',filter='whpage') @ddt.data(*data) @login def test_OpenWareHouse_Info(self,data): try: for key in data: result = WarehouseI

java 27 - 6 反射之 通过配置文件运行类中的方法

在以前,如果我们想要调用一个类中的方法,只能这样子: 例: 有Cat和Dog两个类,里面有eat和run两个成员方法: 1 public class Dog { 2 3 public void eat() { 4 System.out.println("狗吃肉"); 5 } 6 7 public void run() { 8 System.out.println("狗刨"); 9 } 10 } public class Cat { public void eat()

Java反射机制及IoC原理

一. 反射机制概念 主要是指程序可以访问,检测和修改它本身状态或行为的一种能力,并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义.在java中,只要给定类的名字, 那么就可以通过反射机制来获得类的所有信息. 反射是Java中一种强大的工具,能够使我们很方便的创建灵活的代码,这些代码可以再运行时装配,无需在组件之间进行源代码链接.但是反射使用不当会成本很高! 类中有什么信息,利用反射机制就能可以获得什么信息,不过前提是得知道类的名字. 二. 反射机制的作用 在运行时判断任意