6、获取Class中的方法

6.1 getMethods() 获取的都是共有的方法(包括父类)

  • 返回包含一个数组 方法对象反射由此表示的类或接口的所有公共方法 类对象,包括那些由类或接口和那些从超类和超接口继承的声明。
  • 如果此类对象表示具有多个具有相同名称和参数类型但具有不同返回类型的公共方法的类型,则返回的数组对于每个此类方法都有一个方法对象。
  • 如果此类对象表示与类初始化方法的类型 ,则返回的阵列不具有相应的方法对象。
  • 如果此类对象表示一个数组类型,则返回的阵列具有方法对于每个由阵列类型从继承的公共方法对象Object 。 它不包含方法对象clone() 。
  • 如果此类对象表示一个接口,那么返回的数组不包含任何隐含声明的方法,从Object 。因此,如果在此接口或其任何超级接口中没有显式声明方法,则返回的数组的长度为0.(注意,表示类的类对象始终具有从Object公共方法)。
  • 如果此类对象表示原始类型或空值,则返回的数组的长度为0。
  • 由此类对象表示的类或接口的超级接口中声明的静态方法不被视为类或接口的成员。
  • 返回的数组中的元素不会被排序,并且不是以任何特定的顺序。
/**
* 获取指定Class中的公共函数
*/
@Test
public void getMethodDemo() throws Exception {
Class clazz = Class.forName("com.hw.bean.Person");
Method[] methods = clazz.getMethods();
for (Method method : methods) {
System.out.println(method);
}
}

运行:

6.2 getDeclaredMethods() 获取本类中的所有的方法(包含私有的)

  • 返回包含一个数组方法对象反射的类或接口的所有声明的方法,通过此表示类对象,包括公共,保护,默认(包)访问和私有方法,但不包括继承的方法。
  • 如果此类对象表示具有多个具有相同名称和参数类型但具有不同返回类型的声明方法的类型,则返回的数组对于每个此类方法都有一个方法对象。
  • 如果此类对象表示具有类初始化方法的类型 ,则返回的阵列不具有相应的方法对象。
  • 如果此类对象表示没有声明方法的类或接口,则返回的数组的长度为0。
  • 如果这个类对象表示一个数组类型,一个基本类型,或者是void,则返回的数组的长度为0。
  • 返回的数组中的元素不会被排序,并且不是以任何特定的顺序。
@Test
public void getMethodDemo_2() throws Exception {
Class clazz = Class.forName("com.hw.bean.Person");
Method[] methods = clazz.getDeclaredMethods();
for (Method method : methods) {
System.out.println(method);
}
}

运行:

6.3 getMethod(String name, 类<?>... parameterTypes) 获取单个方法

  • 返回一个方法对象,它反映此表示的类或接口的指定公共成员方法类对象。
  • name参数是一个String它指定了所需方法的简单名称。
  • parameterTypes参数是以声明顺序标识方法的形式参数类型的类对象的数组。
  • 如果parameterTypes是null ,它被视为一个空数组。
6.3.1 方法无参 方式一:使用无参构造器(默认) method.invoke(o, null)
@Test
public void getMethodDemo_3() throws Exception {
Class clazz = Class.forName("com.hw.bean.Person");
// 获取空参的一般方法
Method method = clazz.getMethod("show", null);
Object o = clazz.newInstance();
method.invoke(o, null);
System.out.println(method);
}

运行:

6.3.2 方法无参 方式二:使用有参构造器 method.invoke(o, null)
@Test
public void getMethodDemo_4() throws Exception {
Class clazz = Class.forName("com.hw.bean.Person");
// 获取空参的一般方法
Method method = clazz.getMethod("show", null);
// 获取带参构造器
Constructor constructor = clazz.getConstructor(String.class, int.class);
Object o = constructor.newInstance("小明", 12);
method.invoke(o, null);
System.out.println(method);
}

运行:

6.3.3 方法有参
@Test
public void getMethodDemo_5() throws Exception {
Class clazz = Class.forName("com.hw.bean.Person");
Method method = clazz.getMethod("paramMethod", String.class, int.class);
// 获取带参构造器
Constructor constructor = clazz.getConstructor(String.class, int.class);
Object o = constructor.newInstance("小明", 12);
method.invoke(o, "张三", 18);
System.out.println(method);
}

运行:


本章节源码: ReflectDemo4

6、获取Class中的方法的更多相关文章

  1. C#获取类中所有方法

    var t = typeof(HomeController); //获取所有方法 System.Reflection.MethodInfo[] methods = t.GetMethods(); // ...

  2. C#通过反射获取类中的方法和参数个数,反射调用方法带参数

    using System; using System.Reflection; namespace ConsoleApp2 { class Program { static void Main(stri ...

  3. 获取DLL中的方法名称

      OpenFileDialog obj = new OpenFileDialog(); if (obj.ShowDialog() == System.Windows.Forms.DialogResu ...

  4. django rest framework serializer中获取request中user方法

    views.py   serializer = self.get_serializer(data=request.data, context={'request': request}) seriali ...

  5. ASP.NET Core MVC中的IActionFilter.OnActionExecuting方法,可以获取Controller的Action方法参数值

    用过ASP.NET Core MVC中IActionFilter拦截器的开发人员,都知道这是一个非常强大的MVC拦截器.最近才发现IActionFilter的OnActionExecuting方法,甚 ...

  6. 详解C#泛型(二) 获取C#中方法的执行时间及其代码注入 详解C#泛型(一) 详解C#委托和事件(二) 详解C#特性和反射(四) 记一次.net core调用SOAP接口遇到的问题 C# WebRequest.Create 锚点“#”字符问题 根据内容来产生一个二维码

    详解C#泛型(二)   一.自定义泛型方法(Generic Method),将类型参数用作参数列表或返回值的类型: void MyFunc<T>() //声明具有一个类型参数的泛型方法 { ...

  7. js获取输入框中当前光标位置并在此位置插入字符串的方法(angularjs+ts)

    一半是参照别人代码,一半是自己代码,略笨拙,如果有更好的方法希望分享. 获取当前光标位置的方法 getCaretPosition (obj:any) { //获取输入框中当前光标的位置,obj为此输入 ...

  8. APPCAN开发笔记:html页面之间的参数传递:使用js获取url中的参数,以及在APPCAN中不能使用的解决方法

    用PHP的GET/POST方式来传递方式已经是司空见惯了,但是如果我的页面是一个静态的html的页面,想传递参数的时候要怎么办呢?在APPCAN的开发中我们会经常遇到这样的问题,因为所有的页面都是静态 ...

  9. JSF页面中使用js函数回调后台bean方法并获取返回值的方法

    由于primefaces在国内使用的并不是太多,因此,国内对jsf做系统.详细的介绍的资料很少,即使有一些资料,也仅仅是对国外资料的简单翻译或者是仅仅讲表面现象(皮毛而已),它们的语句甚至还是错误的, ...

随机推荐

  1. java.lang.reflect.InvocationTargetException at shade.com.datastax.spark.connector.google.common.base.Throwables.propagate(Throwables.java160)

    org.apache.spark.SparkException: Job aborted due to stage failure: Task 1 in stage 29.1 failed 4 tim ...

  2. phpstrom

    在phpstrom 中启用composer 步骤: 1.打开编辑器,选择 文件(file)->设置(setting),找到 Command Line Tool Support ,点击 + 号进行 ...

  3. jenkins sonarqube 代码检测部署

    install pgsql and sonarqube docker run --name postgresqldb -e POSTGRES_USER=sonar -e POSTGRES_PASSWO ...

  4. WUSTOJ 1208: 计算整数四则运算表达式的结果(Java)

    1208: 计算整数四则运算表达式的结果 参考资料 数据结构(C语言版)严蔚敏 吴伟民 编著----表达式求值 题目   简单四则运算.更多内容点击标题. 保证表达式合法. 运算符只包含:加(+),减 ...

  5. sql server 学习笔记 (nested transaction 嵌套事务)

    什么时候会用到嵌套事务 ? 为了代码复用,我们会写许多的储蓄过程,而中间如果需要使用到 transaction 难免就会发生嵌套了. sql server 并不直接支持嵌套事务. 但它可以用一些招式来 ...

  6. 怎样理解window.name

    window.name表示当前窗口的名字, 而非网页的名字, 网页的名字需要使用: document.title; window.name一般是空的字符串, 他的作用其实是配合配合超链接和表单的tar ...

  7. 本地虚拟机NAT模式下怎么设置才可以访问外网

    记:因为我要在本机虚拟机上安装Docker,结果发现虚拟机环境不能上网,是主机模式.我要调成net模式下才可以访问外网,这就需要怎么设置.下面文章记录一下. 在本机安装VMware软件后,系统中会自动 ...

  8. C# 整型数和浮点型数的进制转换

    1.十进制转二进制 /// <summary> /// 十进制转二进制 /// </summary> public class Convert10To2 { /// <s ...

  9. DotNet跨平台 - docker部署.net core2.0项目

    参考文档: https://docs.docker.com/install/linux/docker-ce/centos/ http://www.dockerinfo.net/document htt ...

  10. JDBC 复习1 DBUtil

    package dbex; import java.io.Closeable; import java.io.IOException; import java.io.InputStream; impo ...