Java反射 获取/修改方法

Java反射可以用于获取类的方法信息,包括方法名、参数类型、返回类型等,也可以使用反射调用类的方法并修改其返回值。本文将介绍如何使用Java反射获取和修改方法。

1、获取方法信息
使用Java反射获取方法信息的过程包括以下几个步骤:
1、通过Class对象获取Method对象,需要提供方法名和参数类型。
2、调用Method对象的getName()方法获取方法名。
3、调用Method对象的getParameterTypes()方法获取参数类型数组。
4、调用Method对象的getReturnType()方法获取返回类型。

下面是一个示例代码,演示如何获取一个类的方法信息:

import java.lang.reflect.Method;

public class MethodDemo {
    public static void main(String[] args) throws Exception {
        Class<?> cls = Person.class;
        Method method = cls.getMethod("sayHello", String.class);
        System.out.println("Method name: " + method.getName());
        Class<?>[] parameterTypes = method.getParameterTypes();
        System.out.print("Parameter types: ");
        for (Class<?> parameterType : parameterTypes) {
            System.out.print(parameterType.getName() + " ");
        }
        System.out.println();
        System.out.println("Return type: " + method.getReturnType().getName());
    }
}

class Person {
    public void sayHello(String name) {
        System.out.println("Hello, " + name + "!");
    }
}

输出结果为:
Method name: sayHello
Parameter types: java.lang.String 
Return type: void

在这个例子中,我们首先获取了Person类的Class对象,然后使用Class对象的getMethod()方法获取sayHello()方法的Method对象。最后,我们通过调用Method对象的getName()、getParameterTypes()和getReturnType()方法分别获取方法名、参数类型和返回类型。

2、调用方法
Java反射不仅可以获取方法信息,还可以使用Method对象调用方法。使用Method对象调用方法的过程包括以下几个步骤:
1、通过Class对象获取Method对象,需要提供方法名和参数类型。
2、调用Method对象的invoke()方法,需要提供方法所属对象和方法的参数。

下面是一个示例代码,演示如何使用Java反射调用一个类的方法:

import java.lang.reflect.Method;

public class MethodInvokeDemo {
    public static void main(String[] args) throws Exception {
        Class<?> cls = Person.class;
        Method method = cls.getMethod("sayHello", String.class);
        Person person = new Person();
        method.invoke(person, "Alice");
    }
}

class Person {
    public void sayHello(String name) {
        System.out.println("Hello, " + name + "!");
    }
}

输出结果为:
Hello, Alice!

在这个例子中,我们首先获取了Person类的Class对象,然后使用Class对象的getMethod()方法获取sayHello()方法的Method对象。最后,我们创建了Person对象,并使用Method对象的invoke()方法调用sayHello()方法,并将”Alice”作为参数传递给该方法。

3、修改方法返回值
Java反射可以使用Method对象修改方法的返回值。使用Method对象修改方法返回值,通常使用动态代理实现。具体实现过程如下:
1、创建一个实现了 InvocationHandler 接口的代理类,该类的 invoke 方法会被调用。
2、在 invoke 方法中获取要代理的方法,并调用该方法。
3、修改方法的返回值。
4、返回修改后的返回值。

下面是一个简单的示例代码:

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class MethodReturnValueChanger {
    public static void main(String[] args) {
        // 创建一个要代理的对象
        Hello hello = new HelloImpl();

        // 创建一个实现了 InvocationHandler 接口的代理类
        InvocationHandler handler = new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                // 调用被代理对象的方法
                Object result = method.invoke(hello, args);
                // 修改方法的返回值
                if (result instanceof String) {
                    result = ((String) result).toUpperCase();
                }
                // 返回修改后的返回值
                return result;
            }
        };

        // 使用 Proxy.newProxyInstance 创建代理对象
        Hello helloProxy = (Hello) Proxy.newProxyInstance(
                Hello.class.getClassLoader(),
                new Class[]{Hello.class},
                handler
        );

        // 调用代理对象的方法
        System.out.println(helloProxy.sayHello("Java Reflection"));
    }
}

interface Hello {
    String sayHello(String name);
}

class HelloImpl implements Hello {
    @Override
    public String sayHello(String name) {
        return "Hello, " + name + "!";
    }
}

上面的代码中,我们创建了一个实现了 InvocationHandler 接口的代理类,在 invoke 方法中调用了被代理对象的方法,并修改了方法的返回值。最后使用 Proxy.newProxyInstance 方法创建代理对象,并调用代理对象的方法。