有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

使用JAVA反射类执行函数

当我调用myClass时,我有以下课程。doprocess(),我应该得到字符串“hai”,如何实现它

public class myClass{
    public int doprocess(){
        dataClass objSt = new dataClass();
        Class newCls = objSt.getClass();
        Method[] methods = newCls.getMethods();
        for (Method method : methods) {
            if(method.getName() == "getList"){
                return method;
            }

        }
    }
 }

class dataClass{
   public String getList(){
        return "hai,";
    }
}

如果我执行上述代码,我会得到如下响应

public java.lang.String com.myproject.controller.dataClass.getList()

但我需要响应是getList函数的返回值


共 (2) 个答案

  1. # 1 楼答案

    无法编译当前代码,因为doprocess方法声明为返回int,但方法体返回Method对象

    要使用反射调用该方法,请使用invoke

    试试这个:

    class myClass {
        public Method doprocess() {
            dataClass objSt = new dataClass();
            Class newCls = objSt.getClass();
            Method[] methods = newCls.getMethods();
            for (Method method : methods) {
                System.out.println(method.getName());
                if (method.getName() == "getList") {
                    return method;
                }
    
            }
            return null;
        }
    
        public static void main(String[] args) {
            try {
                Method m = new myClass().doprocess();
                if(m != null) System.out.println(m.invoke(new dataClass()));
            } catch (IllegalAccessException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IllegalArgumentException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
    
    class dataClass {
        public String getList() {
            return "hai,";
        }
    }
    
  2. # 2 楼答案

    您可以使用getDeclaredMethod获取具有给定名称和参数集的方法,然后可以使用Method.invoke(instance, params...)调用该方法

    class myClass {
        public String doprocess() throws SecurityException, NoSuchMethodException,
                IllegalArgumentException, IllegalAccessException,
                InvocationTargetException {
            dataClass objSt = new dataClass();
            Method m = dataClass.class
                    .getDeclaredMethod("getList", (Class<?>) null);
            return (String) m.invoke(objSt, (Object) null);
        }
    }
    
    class dataClass {
        public String getList() {
            return "hai,";
        }
    }
    

    试验

    public class Test {
    
        public static void main(String[] args) throws SecurityException,
                IllegalArgumentException, NoSuchMethodException,
                IllegalAccessException, InvocationTargetException {
            myClass m = new myClass();
            System.out.println(m.doprocess());
        }
    
    }