通过反射调用成员方法

获取 Method 对象 (更多请查看JDK文档,关键字:Class)

  • Method[] getMethods()  类中的所有公共的成员方法,包括继承过来的
  • Method[] getDeclaredMethods()  类中所有的成员方法,不包括继承的
  • Method getMethod(String name, Class<?>... parameterTypes)  单个公共的成员方法 (方法名,形参列表...
  • Method getDeclaredMethod(String name, Class<?>... parameterTypes)  单个的不考虑修饰符的成员方法 (方法名,形参列表...

调用方法 (更多请查看JDK文档,关键字:Method)

  • Object invoke(Object obj, Object... args)  (对象名,方法实参...) 
import java.io.FileInputStream;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Properties;

public class Test1 {
    public static void main(String[] args) throws IOException, ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InstantiationException, InvocationTargetException {
        Properties properties = new Properties();
        FileInputStream fis= new FileInputStream("day14\\class.properties");
        properties.load(fis);
        //  从集合中,把className的信息获取到
        String className = properties.getProperty("className");
        //  将当前的类加载进内存,形参Class类对象
        Class<?> c = Class.forName(className);

        //  Method[] getMethods()  类中的所有公共的成员方法,包括继承过来的
        Method[] methods = c.getMethods();
        for (Method method : methods) {
            System.out.println(method);
        }
        System.out.println("--------------------");
        //  Method[] getDeclaredMethods() 类中所有的成员方法,不包括继承的
        Method[] declaredMethods = c.getDeclaredMethods();
        for (Method declareMethod : declaredMethods) {
            System.out.println(declareMethod);
        }
        System.out.println("--------------------");
        // Method getMethod(String name, Class<?>... parameterTypes) 单个的公共的成员方法
        Method getAge = c.getMethod("getAge");    // 参数写 (公共的)方法名
        Method getAddress = c.getMethod("getAddress");
        System.out.println(getAddress + "\n" + getAge);
        System.out.println("--------------------");
        // Method getDeclaredMethod(String name, Class<?>... parameterTypes) 单个的不考虑修饰符的成员方法
        Class[] parameterTypes = { String.class, int.class };  // 参数 数组
        Method play = c.getDeclaredMethod("play", parameterTypes);  // 写法一
        Method play1 = c.getDeclaredMethod("play", String.class, int.class); // 写法二
        System.out.println(play);
        System.out.println("--------------------");
// 读取配置文件的做法
        String methodName = properties.getProperty("methodName");   // 方法名
        String methodArgs = properties.getProperty("methodArgs");   // 方法的形参
        String methodValues = properties.getProperty("methodValues");   // 实参
        String[] methodArgsSplit = methodArgs.split(",");
        String[] methodValuesSplit = methodValues.split(",");

        Object o = c.newInstance();

    // 调用 study(String subject) 方法
        if ( methodArgsSplit.length == 1 && methodArgsSplit[0].equals("String.class") ) {
            Method method = c.getDeclaredMethod(methodName, String.class);
            method.setAccessible(true);
            if ( o instanceof Student ) {
                Student stu = (Student) o;
                method.invoke(stu, methodValuesSplit[0]);  // 调用方法  method.invoke(对象名, 实参列表)
            }
        }
    // 调用 play(String sth, int num) 方法
        else if ( methodArgsSplit.length == 2 && methodArgsSplit[0].equals("String.class") && methodArgsSplit[1].equals("int.class")) {
            Method method = c.getDeclaredMethod(methodName, String.class, int.class);
            method.setAccessible(true);
            if ( o instanceof Student ) {
                Student stu = (Student) o;
                method.invoke( stu, methodValuesSplit[0], Integer.parseInt(methodValuesSplit[1]) ); // 注意:String -> int
            }
        }
        fis.close();
    }
}

Student 类 代码在这:反射创建实例对象 - 鹿先森JIAN - 博客园 (cnblogs.com)

 

posted @ 2022-07-15 14:54  鹿先森JIAN  阅读(44)  评论(0编辑  收藏  举报