java反射获取和调用方法

 更新时间:2017年12月05日 11:50:30   投稿:laozhang  
本篇内容主要给大家详细讲解了java反射获取方法以及调用方法,需要的朋友参考学习一下吧。

Class类中获取方法:
public Method[] getMethods();//获取包括自身和继承(实现)过来的所有的public方法——Method不支持泛型<>,即后面不接<>
public Method[] getDeclaredMethods();//获取自身所有的方法(private、public、protected,和访问权限无关),不包括继承的
在jdk1.8后可以直接获取私有属性的方法不需要设置权限 但是仅限于getDeclaredMethod方法 对于Method 的方法仍然需要设置
权限。
public Method[] getMethod(String methodName, Class<T>...parameterTypes);//表示获取指定的一个公共的方法,包括继承的
参数: methodName:表示获取的方法的名字
parameterTypes:表示获取的方法的参数的Class类型
public Method[] getDeclaredMethod(String methodName, Class<T>...parameterTypes);//表示获取本类中的一个指定的方法(private、protected、public,与访问权限无关),不包括继承的方法

Class clazz = new Person().getClass(); 
 try { 
  //调用指定的方法 
  /*@SuppressWarnings("unchecked") 
  Method me = clazz.getDeclaredMethod("getName", String.class); 
  me.invoke(clazz.newInstance(),"zhangsan");*/ 
  //获取所有的方法 
  Method[] methods = clazz.getDeclaredMethods(); 
  for (Method method : methods) { 
  System.out.println(method.getName()); 
  } 
 } catch (Exception e) { 
  e.printStackTrace(); 
 } 

对于多个参数的方法调用:getDeclaredMethod后面跟的parameterTypes可以理解为Class类型的形参 ,通过调用invoke来赋实参 多个参数的赋值 最好是包装在new Object[]{}中 。

@SuppressWarnings("unchecked") 
Method method = clazz.getDeclaredMethod("getName",new Class[]{String.class,int.class}); 
method.invoke(new Person(), new Object[]{"zhangsan",10});

调用静态方法

class User{
public static void staticMethod(){
System.out.println(“static mthod invoke.”);
}
}
Eg:
Class<User> clz=User.class;
Method staticMethod=clz.getMethod(“staticMthod”);

两种方式调用静态方法:

1. 因为静态方法属于所有实例对象公共的,可以创建该类的一个任意对象,通过该对象调用
staticMethod.invoke(clz.newInstance());//staticMethod无参,故参数列表类型不填

2. 如果底层方法是静态的,那么可以忽略指定的obj参数,将obj参数设置为null即可
staticMethod.invoke(null);

 

更多相关的内容:

一:反射概念

可以通过Class类获取某个类的成员变量以及方法,并且调用之。

二:通过反射获取方法、变量、构造方法

@Test
 // 通过反射获取类定义的方法
 public void testMethod() throws Exception {
  @SuppressWarnings("rawtypes")
  Class clazz = Class.forName("java.lang.String");
  Method[] m = clazz.getDeclaredMethods();
  for (int i = 0; i < m.length; i++) {
   System.out.println(m[i].getName() + " " + m[i].getDeclaringClass());
  }
 }

 @Test
 // 通过反射获取类定义的变量
 public void testField() throws Exception {
  @SuppressWarnings("rawtypes")
  Class clazz = Class.forName("java.lang.String");
  Field[] fields = clazz.getFields();
  for (Field f : fields) {
   System.out.println(f.getName());
  }
 }

 @Test
 // 通过反射获取类定义的构造方法
 public void testConstructor() throws Exception {
  @SuppressWarnings("rawtypes")
  Class clazz = Class.forName("java.lang.String");
  @SuppressWarnings("rawtypes")
  Constructor[] cons = clazz.getConstructors();
  for (@SuppressWarnings("rawtypes")
  Constructor c : cons) {
   System.out.println(c + " " + c.getDeclaringClass());
  }
 }

三:通过反射调用类定义的方法

@Test
 // 通过反射调用类定义的方法
 public void testInvokeMethod() throws Exception {
  Class clazz = Class.forName("java.lang.String");
  // 定义参数类型
  Class[] params = new Class[1];
  params[0] = String.class;
  Method m = clazz.getDeclaredMethod("indexOf", params);
  // 设置参数
  Object[] p = new Object[1];
  p[0] = "e";
  Integer s = (Integer) m.invoke("helloworld!", p);
  System.out.println(s);
 }

相关文章

  • AQS同步组件Semaphore信号量案例剖析

    AQS同步组件Semaphore信号量案例剖析

    这篇文章主要为大家介绍了AQS同步组件Semaphore信号量案例剖析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • Java实现将PPT转为OFD过程详解

    Java实现将PPT转为OFD过程详解

    本文将通过Java后端程序代码展示如何实现将PPT幻灯片转成OFD格式,文中的示例代码讲解详细,对我们学习或工作有一定的帮助,需要的可以参考一下
    2022-01-01
  • 应用市场中Java拦截器和切面的使用实例详解

    应用市场中Java拦截器和切面的使用实例详解

    这篇文章主要介绍了应用市场中Java拦截器和切面的使用实例详解,具有一定借鉴价值,需要的朋友可以参考下
    2018-01-01
  • springboot Long 精度丢失问题解决

    springboot Long 精度丢失问题解决

    这篇文章主要为大家介绍了解决springboot Long 精度丢失问题的方法详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • Spring Boot系列教程之7步集成RabbitMQ的方法

    Spring Boot系列教程之7步集成RabbitMQ的方法

    RabbitMQ 即一个消息队列,主要是用来实现应用程序的异步和解耦,同时也能起到消息缓冲,消息分发的作用。下面这篇文章主要给大家介绍了关于Spring Boot之7步集成RabbitMQ的相关资料,需要的朋友可以参考下
    2018-11-11
  • Java SE求解汉诺塔问题的示例代码

    Java SE求解汉诺塔问题的示例代码

    汉诺塔问题是一个经典的问题。汉诺塔(Hanoi Tower),又称河内塔,源于印度一个古老传说。本文将用Java SE求解这一问题,感兴趣的可以学习一下
    2022-03-03
  • OPENCV+JAVA实现人脸识别

    OPENCV+JAVA实现人脸识别

    这篇文章主要为大家详细介绍了OPENCV+JAVA实现人脸识别,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-02-02
  • 解决springboot 连接 mysql 时报错 using password: NO的方案

    解决springboot 连接 mysql 时报错 using password: NO的方案

    在本篇文章里小编给大家整理了关于解决springboot 连接 mysql 时报错 using password: NO的方案,有需要的朋友们可以学习下。
    2020-01-01
  • Java 深入探究讲解工厂方法模式

    Java 深入探究讲解工厂方法模式

    工厂方法模式(FACTORY METHOD)是一种常用的类创建型设计模式,此模式的核心精神是封装类中变化的部分,提取其中个性化善变的部分为独立类,通过依赖注入以达到解耦、复用和方便后期维护拓展的目的。它的核心结构有四个角色,分别是抽象工厂、具体工厂、抽象产品、具体产品
    2022-04-04
  • java使用udp实现简单多人聊天功能

    java使用udp实现简单多人聊天功能

    这篇文章主要为大家详细介绍了java使用udp实现简单多人聊天功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02

最新评论