通过反射调用成员方法
获取 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)