反射——调用类中的指定方法

通过反射调用类中的指定方法

  • 调用指定方法

    通过反射,调用类中的方法,通过 Method 类完成。步骤如下:

    Class cla = Class.forName("com.aze.reflection.Student");
    
    1. 通过 Class 类的 getMethod(String name,Class … parameterTypes) 方法取得一个 Method 对象,并设置此方法操作时所需的参数类型。

      // 得到名为 showInfo,参数为 String,String 的公有方法
      Method mc = cla.getMethod("showInfo", String.class, String.class);
      
    2. 之后使用 Object invoke(Object obj,Object[] args) 进行调用,并向方法中传递要设置的 obj 对象的参数信息。

      //指定获取一个参数为 String,String 类型的公有有参构造方法
      Constructor con = cla.getConstructor();
      // 实例化对象
      Student s = (Student) con.newInstance();
      // 参数一是需要实例化的对象,后面的参数是调用当前的方法的实际参数
      mc.invoke(s,"张三","一中");
      

调用公有的有参方法

Class cla = Class.forName("com.aze.reflection.Student");

// 得到名为 showInfo,参数为 String,String 的公有方法
Method mc = cla.getMethod("showInfo", String.class, String.class);

//指定获取一个参数为 String,String 类型的公有有参构造方法
Constructor con = cla.getConstructor();
// 实例化对象
Student s = (Student) con.newInstance();

// 参数一是需要实例化的对象,后面的参数是调用当前的方法的实际参数
mc.invoke(s,"张三","一中");

调用私有的有参方法

  • 注意要解除封装,强制调用私有。
// 得到名为 showInfo,参数为 String 的所有方法
Method mc = cla.getDeclaredMethod("test1", String.class);

//指定获取一个公有有参构造方法
Constructor con = cla.getConstructor();
// 实例化对象
Student s = (Student) con.newInstance();

// 解除私有封装,强制调用私有
mc.setAccessible(true);

// 参数一是需要实例化的对象,后面的参数是调用当前的方法的实际参数
mc.invoke(s,"张三");

调用公有的重载方法

Class cla = Class.forName("com.aze.reflection.Student");

// 调取一个重载方法
Method met = cla.getMethod("showInfo",int.class);

Constructor con = cla.getConstructor();
Student stu = (Student) con.newInstance();

met.invoke(stu,18);

调用公有的有返回值的方法

Class cla = Class.forName("com.aze.reflection.Student");

//指定获取一个公有有参构造方法
Constructor con = cla.getConstructor();
// 实例化对象
Student s = (Student) con.newInstance();

// 调取有返回值的方法
Method met = cla.getMethod("test2");//获取方法名为 test2,且没有参数的公有方法
String sch = (String) met.invoke(s);
System.out.println(sch);

版权声明:本文为qq_34172440原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。