使用反射的Java调用方法

时间:2017-04-12 10:12:27

标签: java methods reflection method-invocation

我正在尝试使用反射来调用方法。

我调用的方法不是静态的,而是在同一个类中调用它。

我的代码的简化版本:

   $(document).ready(function() {

    var url = window.location.href;

    var urlEnd = url.substr(url.lastIndexOf('/') + 1);

    if (urlEnd !== "") {
        $("#vehicleInfo").show();

    }

});

尽管存在包/类/方法,但我得到的是public class Test { public static void main(String[] args) { Test instance = new Test(); if (args.length > 0) { instance.doWork(args[0]); } } private void doWork(String methodName) { Method method; try { method = this.getClass().getMethod(methodName); method.invoke(this); } catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { [...] } } private void MethodOne() { ... }; private void MethodTwo() { ... }; [...] private void MethodTwenty() { ... }; }

有人能告诉我我做错了吗?

3 个答案:

答案 0 :(得分:2)

  

我得到的是java.lang.NoSuchMethodException:   correct.package.and.class.MethodTwo()...

您正在调用{0}没有回赠私有方法的getMethod()

假设 arg [0] 具有正确的方法名称(如果不是,您将再次获得 java.lang.NoSuchMethodException ),2件事必须在这里完成:

  1. 您需要使用getDeclaredMethod(因为 MethodOne 是私有声明的)

  2. 您需要设置访问它的标志.setAccessible(true)(这将允许您调用声明为私有的方法)

  3. 示例:

        Method method;
        try {
            method = f.getClass().getDeclaredMethod("doThis");
    
            method.setAccessible(true);
            method.invoke(f);
        } catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException
                | InvocationTargetException e) {
            System.err.println("Opala, somethign went wrong here!");
        } 
    

答案 1 :(得分:1)

您访问方法的方式是正确的。 方法访问说明符是私有的。因此抛出错误。

请将访问说明符更改为公开,它会起作用。

import java.lang.reflect.Method;

public class Test {
  public static void main(String[] args) {
    Test instance = new Test();
    if (args.length > 0) {
      instance.doWork(args[0]);
    }
  }

  private void doWork(String methodName) {
    Method method;

    try {
      method = this.getClass().getMethod(methodName);
      method.invoke(this);
    } catch (Exception e) {

    }
  }

  public void MethodOne() { System.out.println("Method 1"); };
  public void MethodTwo() { System.out.println("Method 2"); };
  public void MethodTwenty() { System.out.println("Method 3"); };
}

如果您尝试访问私有方法或构造函数,则需要更改代码。

谢谢, Thiruppathi S

答案 2 :(得分:0)

从中调用方法的类

public class Computer {

private String brandName;
private int yearManufactured;

public String getBrandName() {
    return brandName;
 }

public void setBrandName(String brandName) {
    this.brandName = brandName;
 }

public int getYearManufactured() {
    return yearManufactured;
 }

public void setYearManufactured(int yearManufactured) {
    this.yearManufactured = yearManufactured;
 }

}

实现类

public class Test {

public static void main(String[] args) throws NoSuchMethodException,  
        InvocationTargetException, IllegalAccessException{
          
    Class curClass = Computer.class;
    Method[] allMethods = curClass.getDeclaredMethods();
    
    Computer myComputer = new Computer();
          
    for(int c = 0; c < allMethods.length; c++){
             
        Class[] parameterTypes = allMethods[c].getParameterTypes();           
        for(Class parameterType: parameterTypes){
           
           System.out.println(parameterType.getName());                
           
           switch(parameterType.getName()){
           
               case "java.lang.String":                     
                   allMethods[c].invoke(myComputer, "LENOVO");
               break;
               
               case "int":        
                   allMethods[c].invoke(myComputer, 2021);
               break;               
           }
        }                 
    }
    
    System.out.println("BRAND NAME :"+myComputer.getBrandName());
    System.out.println("YEAR MANUFACTURED: "+myComputer.getYearManufactured());

  }
 }