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);
 }

相关文章

  • Java redisTemplate阻塞式处理消息队列

    Java redisTemplate阻塞式处理消息队列

    用redis中的List可以实现队列,这样可以用来做消息处理和任务调度的队列。因此,本文将主要为大家介绍如何利用redisTemplate处理消息队列,感兴趣的小伙伴可以了解一下
    2021-12-12
  • idea打包java程序(包含依赖的所有jar包)

    idea打包java程序(包含依赖的所有jar包)

    这篇文章主要介绍了idea打包java程序(包含依赖的所有jar包),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06
  • Spring Boot应用关闭分析详解

    Spring Boot应用关闭分析详解

    本文挖掘了Spring Boot的关闭方式,并列举了关闭方式,从原理、源码的角度阐述了Spring Boot的关闭代码及扩展点,感兴趣的朋友一起看看吧
    2024-12-12
  • Java中equals()知识点总结

    Java中equals()知识点总结

    在本篇文章里小编给大家分享的是关于Java中equals()知识点总结内容,需要的朋友们可以学习参考下。
    2020-03-03
  • SpringSecurity实现前后端分离的示例详解

    SpringSecurity实现前后端分离的示例详解

    Spring Security默认提供账号密码认证方式,具体实现是在UsernamePasswordAuthenticationFilter 中,这篇文章主要介绍了SpringSecurity实现前后端分离的示例详解,需要的朋友可以参考下
    2023-03-03
  • Java定义队列结构,并实现入队、出队操作完整示例

    Java定义队列结构,并实现入队、出队操作完整示例

    这篇文章主要介绍了Java定义队列结构,并实现入队、出队操作,结合完整实例形式分析了java数据结构中队列的定义、入队、出队、判断队列是否为空、打印队列元素等相关操作技巧,需要的朋友可以参考下
    2020-02-02
  • Spark SQL的自定义函数UDF使用

    Spark SQL的自定义函数UDF使用

    Spark Sql可以通过UDF来对DataFrame的Column进行自定义操作。在特定场景下定义UDF可能需要用到Spark Context以外的资源或数据。比如从List或Map中取值,或是通过连接池从外部的数据源中读取数据,然后再参与Column的运算
    2023-02-02
  • 基于Java ActiveMQ的实例讲解

    基于Java ActiveMQ的实例讲解

    下面小编就为大家带来一篇基于Java ActiveMQ的实例讲解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09
  • 详解Spring mvc的web.xml配置说明

    详解Spring mvc的web.xml配置说明

    本篇文章主要介绍了Spring mvc的web.xml配置说明,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-02-02
  • SpringBoot项目中连接Gauss数据库

    SpringBoot项目中连接Gauss数据库

    本文主要介绍了SpringBoot项目中连接Gauss数据库,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-06-06

最新评论