将方法名称作为字符串给定时,如何调用Java方法?

如果我有两个变量:

Object obj;
String methodName = "getName";

在不知道obj类的情况下,我怎样才能调用由methodName标识的方法呢?

被调用的方法没有参数和一个String返回值。 这是一个Java bean的getter。


从臀部编码,它会是这样的:

java.lang.reflect.Method method;
try {
  method = obj.getClass().getMethod(methodName, param1.class, param2.class, ..);
} catch (SecurityException e) { ... }
  catch (NoSuchMethodException e) { ... }

这些参数标识您需要的非常具体的方法(如果有几个可用的重载,如果该方法没有参数,则只给出methodName )。

然后通过调用来调用该方法

try {
  method.invoke(obj, arg1, arg2,...);
} catch (IllegalArgumentException e) { ... }
  catch (IllegalAccessException e) { ... }
  catch (InvocationTargetException e) { ... }

再一次,如果你没有,在.invoke.invoke参数。 但是,是的。 阅读Java反射


反射使用方法调用:

Class<?> c = Class.forName("class name");
Method method = c.getDeclaredMethod("method name", parameterTypes);
method.invoke(objectToInvokeOn, params);

哪里:

  • "class name""class name"
  • objectToInvokeOn是Object类型的,并且是要调用该方法的对象
  • "method name"是您想要调用的方法的名称
  • parameterTypes的类型是Class[]并声明该方法需要的参数
  • params的类型为Object[]并声明传递给该方法的参数

  • 对于那些想在Java 7中直接使用代码示例的人:

    Dog类:

    package com.mypackage.bean;
    
    public class Dog {
        private String name;
        private int age;
    
        public Dog() {
            // empty constructor
        }
    
        public Dog(String name, int age) {
            this.name = name;
            this.age = age;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    
        public void printDog(String name, int age) {
            System.out.println(name + " is " + age + " year(s) old.");
        }
    }
    

    ReflectionDemo类:

    package com.mypackage.demo;
    
    import java.lang.reflect.*;
    
    public class ReflectionDemo {
    
        public static void main(String[] args) throws Exception {
            String dogClassName = "com.mypackage.bean.Dog";
            Class<?> dogClass = Class.forName(dogClassName); // convert string classname to class
            Object dog = dogClass.newInstance(); // invoke empty constructor
    
            String methodName = "";
    
            // with single parameter, return void
            methodName = "setName";
            Method setNameMethod = dog.getClass().getMethod(methodName, String.class);
            setNameMethod.invoke(dog, "Mishka"); // pass arg
    
            // without parameters, return string
            methodName = "getName";
            Method getNameMethod = dog.getClass().getMethod(methodName);
            String name = (String) getNameMethod.invoke(dog); // explicit cast
    
            // with multiple parameters
            methodName = "printDog";
            Class<?>[] paramTypes = {String.class, int.class};
            Method printDogMethod = dog.getClass().getMethod(methodName, paramTypes);
            printDogMethod.invoke(dog, name, 3); // pass args
        }
    }
    

    产量: Mishka is 3 year(s) old.


    你可以通过这种方式调用构造函数:

    Constructor<?> dogConstructor = dogClass.getConstructor(String.class, int.class);
    Object dog = dogConstructor.newInstance("Hachiko", 10);
    

    或者,您可以删除

    String dogClassName = "com.mypackage.bean.Dog";
    Class<?> dogClass = Class.forName(dogClassName);
    Object dog = dogClass.newInstance();
    

    并做

    Dog dog = new Dog();
    
    Method method = Dog.class.getMethod(methodName, ...);
    method.invoke(dog, ...);
    

    建议阅读:创建新类实例

    链接地址: http://www.djcxy.com/p/20597.html

    上一篇: How do I invoke a Java method when given the method name as a string?

    下一篇: Printing message on Console without using main() method