zoukankan      html  css  js  c++  java
  • 00113_通过反射获取成员方法并使用

    1、在反射机制中,把类中的成员方法使用类Method表示;

    2、通过Class类中提供的方法获取成员方法:

      (1)返回获取一个方法

    public Method getMethod(String name, Class<?>... parameterTypes)
    获取public 修饰的方法
    public Method getDeclaredMethod(String name, Class<?>... parameterTypes)
    获取任意的方法,包含私有的
    参数1: name 要查找的方法名称; 参数2: parameterTypes 该方法的参数类型

      (2)返回获取多个方法

    public Method[] getMethods() 获取本类与父类中所有public 修饰的方法
    public Method[] getDeclaredMethods() 获取本类中所有的方法(包含私有的

      (3)代码演示

     1 package cn.gzdlh_01_Reflect;
     2 
     3 import java.lang.reflect.Method;
     4 
     5 public class MethodDemo {
     6     public static void main(String[] args) throws ClassNotFoundException,
     7             NoSuchMethodException, SecurityException {
     8         // 获取Class对象
     9         Class c = Class.forName("cn.gzdlh_01_Reflect.Person");
    10 
    11         // 获取多个方法
    12         // Method[] methods = c.getMethods();
    13         Method[] methods = c.getDeclaredMethods();
    14         for (Method method : methods) {
    15             System.out.println(method);
    16         }
    17 
    18         System.out.println("-----------------------");
    19         // 获取一个方法:
    20         // public void method1()
    21         Method method = c.getMethod("method1", null);
    22         System.out.println(method);
    23         // public String method4(String name){
    24         method = c.getMethod("method4", String.class);
    25         System.out.println(method);
    26         // 私有方法
    27         // private void method5()
    28         method = c.getDeclaredMethod("method5", null);
    29         System.out.println(method);
    30     }
    31 }

    3、通过反射,创建对象,调用指定的方法

      (1)获取成员方法,步骤如下:

        ①获取Class对象;

        ② 获取构造方法;

        ③通过构造方法,创建对象;

        ④获取指定的方法;

        ⑤执行找到的方法。

    public Object invoke(Object obj,  Object... args) 
    执行指定对象obj中,当前Method对象所代表的方法,方法要传入的参数通过args指定

      (2)代码演示

     1 package cn.gzdlh_01_Reflect;
     2 
     3 import java.lang.reflect.Constructor;
     4 import java.lang.reflect.InvocationTargetException;
     5 import java.lang.reflect.Method;
     6 
     7 public class MethodDemo2 {
     8     public static void main(String[] args) throws ClassNotFoundException,
     9             NoSuchMethodException, SecurityException, InstantiationException,
    10             IllegalAccessException, IllegalArgumentException,
    11             InvocationTargetException {
    12         // 1, 获取Class对象
    13         Class c = Class.forName("cn.gzdlh_01_Reflect.Person");
    14         // 2,获取构造方法
    15         // public Person(String name, int age, String address){
    16         Constructor con = c.getConstructor(String.class, int.class,
    17                 String.class);
    18         // 3,通过构造方法,创建对象
    19         Object obj = con.newInstance("gzdlh", 23, "广州");
    20         // 4,获取指定的方法
    21         // public void method1() 没有返回值没有参数的方法
    22         // Method m1 = c.getMethod("method1", null);
    23 
    24         // public String method4(String name)
    25         Method m4 = c.getMethod("method4", String.class);
    26 
    27         // 5,执行找到的方法
    28         // m1.invoke(obj, null);
    29 
    30         Object result = m4.invoke(obj, "gzdlh");
    31         System.out.println("result = " + result);
    32     }
    33 }

    4、通过反射,创建对象,调用指定的private 方法

      (1)获取私有成员方法,步骤如下:

        ①获取Class对象;

        ②获取构造方法;

        ③通过构造方法,创建对象;

        ④获取指定的方法;

        ⑤开启暴力访问;

        ⑥执行找到的方法。

    public Object invoke(Object obj,  Object... args)
    执行指定对象obj中,当前Method对象所代表的方法,方法要传入的参数通过args指定。

      (2)代码演示

     1 package cn.gzdlh_01_Reflect;
     2 
     3 import java.lang.reflect.Constructor;
     4 import java.lang.reflect.InvocationTargetException;
     5 import java.lang.reflect.Method;
     6 
     7 public class MethodDemo3 {
     8     public static void main(String[] args) throws ClassNotFoundException,
     9             NoSuchMethodException, SecurityException, InstantiationException,
    10             IllegalAccessException, IllegalArgumentException,
    11             InvocationTargetException {
    12         // 1, 获取Class对象
    13         Class c = Class.forName("cn.gzdlh_01_Reflect.Person");
    14         // 2,获取构造方法
    15         // public Person(String name, int age, String address){
    16         Constructor con = c.getConstructor(String.class, int.class,
    17                 String.class);
    18         // 3,通过构造方法,创建对象
    19         Object obj = con.newInstance("gzdlh", 23, "广州");
    20         // 4,获取指定的方法
    21         // private void method5(){
    22         Method m5 = c.getDeclaredMethod("method5", null);
    23         // 5,开启暴力访问
    24         m5.setAccessible(true);
    25         // 6,执行找到的方法
    26         m5.invoke(obj, null);
    27     }
    28 }

    在反射机制中,把类中的成员方法使用类Method表示

  • 相关阅读:
    svn cleanup failed–previous operation has not finished 解决方法
    开源SNS社区系统推荐
    从网络获取图片本地保存
    MS SQL Server 数据库连接字符串
    KeepAlive
    Configure Git in debian
    sqlserver query time
    RPi Text to Speech (Speech Synthesis)
    SQL Joins with C# LINQ
    search or reseed identity columns in sqlserver 2008
  • 原文地址:https://www.cnblogs.com/gzdlh/p/8159262.html
Copyright © 2011-2022 走看看