Java反射之——方法的反射操作

Java反射中 ,方法的反射操作是通过Method对象调用invoke(对象,参数)方法,之前我们需要知道怎样来确定一个方法?

注:通过方法名和参数列表我们可以唯一确定一个方法。

首先我们获取方法就是获取类中的信息,获取类的信息需要得到类类型,因此我们通过已知A的实例对象a1,调用getClass()方法得到A类类型,然后调用getMethod方法获取到Method对象,然后Method对象调用invoke()方法。

整个流程:

一、已知A类,通过实例对象a1获取类类型

class A{
    public void print() {
        System.out.println("hello world");
    }
    public void print(int a, int b) {
        System.out.println(a+b);
    }
    public void print(String a, String b) {
        System.out.println(a.toUpperCase()+","+b.toLowerCase());
    }
}

TestA a1 = new TestA();

//通过对象获取类的类类型,可以获取到类的信息
Class class1 = a1.getClass();

二、获取Method对象

Method m1 = class1.getMethod("print", int.class, int.class);

源码中getMethod(String name, Class<?>... parameterTypes),第一个参数为方法的名称,第二个是参数列表,在这我们可以通过两种方法来表示

1、int.class, int.class

2、new Class[]{int.class, int.class}——》数组的方式

这两种方式结果都是一样的。

三、通过Method对象调用invoke()方法

源码中invoke方法返回值默认是Object,如果通过反射操作的方法有返回值且不是Object,需要进行强制转换;如果操作的对象没有返回值类型,则返回null。

代码奉上:

/**
 * 方法的反射实际应用,即:通过类类型获取方法对象,再通过方法对象进行反射操作。
 * 注:方法的名称和参数列表唯一确定某一个方法
 * method.invoke(对象,参数)
 */
public class MethodReflectDemo {
    public static void main(String[] args) {
        A a1 = new A();
        //通过对象获取类的类类型,可以获取到类的信息
        Class class1 = a1.getClass();
        //通过方法的名称和参数列表唯一确定一个方法
        try {
            //通过getMethod()方法获取方法对象,在这里可以通过两种方法获取
//            Method me = class1.getMethod("print", new Class[]{int.class, int.class});
            Method me = class1.getMethod("print", int.class, int.class);
            //通过invoke()方法进行方法的反射操作,其是指通过Method对象对方法进行操作
            //invoke()其实是有返回值的,当方法如果没有返回值类型(void)则返回null,如果有返回值类型则返回对应的返回值类型(默认是Object,需要做强制类型转换)
//            Object object = me.invoke(a1, new Object[]{10,20});//传递数组方式
            Object object = me.invoke(a1, 10,20);
            System.out.println("*************************");
//            Method me1 = class1.getMethod("print", new Class[]{String.class, String.class});
            Method me1 = class1.getMethod("print", String.class, String.class);
            object = me1.invoke(a1, "hello", "WORLD");
            System.out.println("*************************");
//            Method me2 = class1.getMethod("print", new Class[]{});
            Method me2 = class1.getMethod("print");
            object = me2.invoke(a1);
            System.out.println("*************************");
            Method m3 = class1.getMethod("print", String.class);
            String s = (String)m3.invoke(a1, "方法的反射操作");
            System.out.println(s);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

class A{
    public void print() {
        System.out.println("hello world");
    }
    public void print(int a, int b) {
        System.out.println(a+b);
    }
    public void print(String a, String b) {
        System.out.println(a.toUpperCase()+","+b.toLowerCase());
    }
    public String print(String s) {
        return s;
    }
}

输出结果:

30
*************************
HELLO,world
*************************
hello world
*************************
方法的反射操作

我们在实际应用中的方法反射操作

一、已知一个实体类,通过属性名,获取其属性值。实现的原理就是:通过字符串拼接Javabean中的方法,进行方法反射方法的操作。

已知的实体类UserReflect。

public class UserReflect {
    private String name;
    private String sex;
    private int age;
    public UserReflect(String name, String sex, int age) {
        super();
        this.name = name;
        this.sex = sex;
        this.age = age;
    }
    public UserReflect() {
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    
    
}

封装方法反射方法的操作

/**
 * 根据对象的属性名获取对象的属性值。
 * 我们是通过字符串拼接成javaBean里的get方法名,然后通过方法反射执行方法。
 */
public class ReflectApplyMethod {
    public static Object getValueByPropertyName(Object object, String propertyName) {
        Object value = null;
        //拼接Javabean中的方法,得到方法名
        String action = "get"+propertyName.substring(0, 1).toUpperCase()+propertyName.substring(1);
        System.out.println("方法名:"+action);
        //通过已知对象object得到类类型
        Class class1 = object.getClass();
        //获取Method对象,get方法都是public,所有使用getMethod()
        try {
            Method m = class1.getMethod(action);
            value = m.invoke(object);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return value;
    }
    
    public static void main(String[] args) {
        //主函数调用通过属性名获取属性值的方法
        UserReflect uReflect = new UserReflect("Tom", "男", 20);
        System.out.println(getValueByPropertyName(uReflect, "name"));
        System.out.println(getValueByPropertyName(uReflect, "sex"));
        System.out.println(getValueByPropertyName(uReflect, "age"));
    }
}

主函数输出结果:

方法名:getName
Tom
方法名:getSex

方法名:getAge
20

猜你喜欢

转载自blog.csdn.net/qq_42296486/article/details/84818951