zoukankan      html  css  js  c++  java
  • 反射获取成员方法(Method)

    1.1.1 反射公开的非静态的成员方法

    Method getDeclaredMethod(String name,Class ... parameterTypes)获取某个方法

    说明:

    1Class类中提供的getDeclaredMethod方法上接收一个String namename表示的是需要反射的那个方法的名字。

    因为在一个类中可以有多个不同的方法。反射的时候需要指定这个方法的名字,同时在一个类中还可能出现方法的重载,这时还需要指定具体反射的是个方法参数类型

    3让反射到的一个方法运行,需要使用Method类中的invoke方法  

          

      Object invoke(Object obj, Object... args)   

       invoke方法中的第一个参数 Object obj:表示的是当前需要调用这个方法的那个对象

       invoke方法中的第二个参数Object... args

        表示的是真正需要运行的某个类中被反射的那个方法需要接收的真实参数

       在调用Method类中的invoke方法的时候,其实底层是在运行被反射的那个方法,

       既然是某个方法在运行,那么方法运行完之后可能会有返回值

    举例:需求:我们想通过反射技术获得Person类中的setName()函数,并让其执行。

    public class ReflectDemo {
    	public static void main(String[] args) throws Exception {
    		//获取Class对象
    		Class clazz = Class.forName("com.baidu.reflect.demo.Person");
    		/*
    		 * 反射成员方法:
    		 * public void setName(String name)
    		 * 类中的非静态的成员方法,需要对象调用,我们反射到方法之后,最后肯定是要运行这个方法
    		 * 这时肯定还是需要对象的
    		 * 
    		 * Method getDeclaredMethod(String name, Class<?>... parameterTypes)  
    		 * String name 反射的方法的名字
    		 * Class<?>... parameterTypes 反射的方法接受的参数类型
    		 */
    		Method method = clazz.getDeclaredMethod("setName", String.class);
    Person p = new Person();
    		//通过非反射的方式执行setName函数
    		/*
    		 *  Person p = new Person();
    		 * 	p.setName("赵四");
    		 * 	System.out.println(p.getName());//赵四
    		*/
    		//通过反射的方式执行setName函数
    		/*
    		 * 让反射到的一个方法运行,需要使用Method类中的invoke方法
    		 *  
    		 *  Object invoke(Object obj, Object... args)  
    		 *  
    		 *  invoke方法中的第一个参数 Object obj:表示的是当前需要调用这个方法的那个对象
    		 *  invoke方法中的第二个参数Object... args:
    		 *  		表示的是真正需要运行的某个类中被反射的那个方法需要接收的真实参数
    		 *  在调用Method类中的invoke方法的时候,其实底层是在运行被反射的那个方法,
    		 *  既然是某个方法在运行,那么方法运行完之后可能会有返回值
    		 */
    		//执行setName函数   这句代码就是在调用反射到Person类中的setName方法
    		Object obj2 = method.invoke(p, "赵四");
    		System.out.println(p);//cn.itcast.sh.reflect.demo.Person@7f21c5df
    		System.out.println(obj2);//null
    		System.out.println(p.getName());//赵四
    		System.out.println("=====================================");
    	}
    }
    

      

  • 相关阅读:
    操作系统笔记(六)页面置换算法 FIFO法 LRU最近最久未使用法 CLOCK法 二次机会法
    文加图, 理解Http请求与响应
    Android Retrofit 2.0使用
    Java 注解 (Annotation)你可以这样学
    MySQL 基本语句
    Java数据类型和MySql数据类型对应表
    Android Library 打造自己的 SDK,并 Maven 发布
    Java并发——线程同步Volatile与Synchronized详解
    Android getScrollX()详解
    图解Android View的scrollTo(),scrollBy(),getScrollX(), getScrollY()
  • 原文地址:https://www.cnblogs.com/xinruyi/p/9413007.html
Copyright © 2011-2022 走看看