java怎么调用方法,Java中方法的三种调用方式

我们已经能通过Class实例获取所有Field对象,Java中方法的三种调用方式,同样的,可以通过Class实例获取所有Method信息。Class类提供了以下几个方法来获取Method:Method

我们已经能通过Class实例获取所有Field对象,Java中方法的三种调用方式,同样的,可以通过Class实例获取所有Method信息。Class类提供了以下几个方法来获取Method:

Method getDeclaredMethod(name,Class...):获取当前类的某个Method(不包括父类)

Method[] getMethods():获取所有public的Method(包括父类)

写一个方法计算两个整数相加的结果(传进两个int型的数字,计算相加的结果并返回)。public int xiangjia(int a,int b){ return a+b;} 在别的地方进行调用:int c;c=xiangjia(1,2);这样就把1和2相加的结果传给了c。

Method[] getDeclaredMethods():获取当前类的所有Method(不包括父类)

我们来看一下示例代码:

/ reflectionpublic class Main { public static void main(String[] args) throws Exception { Class stdClass = Student.class; // 获取public方法getScore,参数为String: System.out.println(stdClass.getMethod("getScore",String.class)); // 获取继承的public方法getName,无参数: System.out.println(stdClass.getMethod("getName")); // 获取private方法getGrade,参数为int: System.out.println(stdClass.getDeclaredMethod("getGrade",int.class)); }}class Student extends Person { public int getScore(String type) { return 99; } private int getGrade(int year) { return 1; }}class Person { public String getName() { return "Person"; }}

上述代码首先获取Student的Class实例,然后,分别获取public方法、继承的public方法以及private方法,打印出的Method类似:

public int Student.getScore(java.lang.String)public java.lang.String Person.getName()private int Student.getGrade(int)

一个Method对象包含一个方法的所有信息:

getName():返回方法名称,例如:"getScore";

getReturnType():返回方法返回值类型,也是一个Class实例,例如:String.class;

java怎么调用方法

getParameterTypes():返回方法的参数类型,是一个Class数组,例如:{String.class,int.class};

getModifiers():返回方法的修饰符,它是一个int,不同的bit表示不同的含义。

调用方法

当我们获取到一个Method对象时,就可以对它进行调用。我们以下面的代码为例:

String s = "Hello world";String r = s.substring(6); // "world"

如果用反射来调用substring方法,需要以下代码:

/ reflectionimport java.lang.reflect.Method;public class Main { public static void main(String[] args) throws Exception { // String对象: String s = "Hello world"; // 获取String substring(int)方法,参数为int: Method m = String.class.getMethod("substring",int.class); // 在s对象上调用该方法并获取结果: String r = (String) m.invoke(s,6); // 打印调用结果: System.out.println(r); }}

注意到substring()有两个重载方法,我们获取的是String substring(int)这个方法。思考一下如何获取String substring(int,int)方法。

对Method实例调用invoke就相当于调用该方法,invoke的第一个参数是对象实例,即在哪个实例上调用该方法,后面的可变参数要与方法参数一致,否则将报错。

调用静态方法

如果获取到的Method表示一个静态方法,调用静态方法时,由于无需指定实例对象,所以invoke方法传入的第一个参数永远为null。我们以Integer.parseInt(String)为例:

/ reflectionimport java.lang.reflect.Method;public class Main { public static void main(String[] args) throws Exception { // 获取Integer.parseInt(String)方法,参数为String: Method m = Integer.class.getMethod("parseInt",String.class); // 调用该静态方法并获取结果: Integer n = (Integer) m.invoke(null,"12345"); // 打印调用结果: System.out.println(n); }}

调用非public方法

方法1. 新建一个类。然后在调用类中先进行被调用类实例化,然后通过实例化的对象访问。例如://先定义一个类 //实例化,调用 方法2.新建一个类,将该类中需要被调用的方法设置为静态(static),加了static后,就可以。

和Field类似,对于非public方法,我们虽然可以通过Class.getDeclaredMethod()获取该方法实例,但直接对其调用将得到一个IllegalAccessException。为了调用非public方法,我们通过Method.setAccessible(true)允许其调用:

/ reflectionimport java.lang.reflect.Method;public class Main { public static void main(String[] args) throws Exception { Person p = new Person(); Method m = p.getClass().getDeclaredMethod("setName",String.class); m.setAccessible(true); m.invoke(p,"Bob"); System.out.println(p.name); }}class Person { String name; private void setName(String name) { this.name = name; }}

此外,setAccessible(true)可能会失败。如果JVM运行期存在SecurityManager,那么它会根据规则进行检查,有可能阻止setAccessible(true)。例如,某个SecurityManager可能不允许对java和javax开头的package的类调用setAccessible(true),这样可以保证JVM核心库的安全。

多态

运行上述代码,发现打印出的是Student:hello,因此,使用反射调用方法时,仍然遵循多态原则:即总是调用实际类型的覆写方法(如果存在)。上述的反射代码:

实际上相当于:

Person p = new Student();p.hello();

小结

Java的反射API提供的Method对象封装了方法的所有信息:

一般的,在Java语言中,调用方法有三种方式第一种是通过对象名加方法名进行调用,这是最普通的也是最常见的一种调用方式,第二种,通过new关键字调用构造方法,这种是在实例化对象时使用的方式,第三种,通过类名加方法名。

通过Class实例的方法可以获取Method实例:getMethod(),getMethods(),getDeclaredMethod(),getDeclaredMethods();

java怎么调用方法

通过Method实例可以获取方法信息:getName(),getReturnType(),getParameterTypes(),getModifiers();

通过Method实例可以调用某个对象的方法:Object invoke(Object instance,Object... parameters);

通过设置setAccessible(true)来访问非public方法;

通过反射调用方法时,仍然遵循多态原则。

【关键:

JAVA中方法的调用主要有以下几种:1.非静态方法非静态方法就是没有 static 修饰的方法,对于非静态方法的调用,是通过对 象来调用的;2.调用静态方法静态方法就是用 static 修饰的方法,静态方法的调用是通过类名来调用的。

Class stdClass = Student.class; // 获取public方法getScore,参数为String: System.out.println(stdClass.getMethod("getScore",String.class));

java怎么调用方法

Method m = String.class.getMethod("substring",int.class); // 在s对象上调用该方法并获取结果: String r = (String) m.invoke(s,6);

通过反射调用方法时,仍然遵循多态原则

上一篇 2022年12月31 11:41
下一篇 2022年12月10 00:28

相关推荐

  • 微信怎么分身,苹果微信怎么分身

    安卓手机无需下载就能实现的微信一键双开,苹果微信怎么分身,实现双微信自由!不用想着买两个手机或者安装微信分身,手机设置一键就能拥有双微信。一、开启步骤1、回到华为手机的桌面找到【设置】并打开2、在设置

    2023年01月15 231
  • 怎样用微信红包购物,微信红包钱怎么用来购物

    之前我们给大家介绍过天猫超市的购物券应该如何使用,天猫超市的翻牌活动又是如何操作的,微信红包钱怎么用来购物,今天我们来给大家介绍天猫超市的红包活动。,一、红包说明查看途径:无线端和PC端均可。我的--

    2023年01月07 200
  • 苹果的音乐怎么用,苹果音乐使用教程

    在2021年苹果WWDC之后,苹果开始在IOS系统上推送14.6版本,伴随这个版本的推送,苹果音乐使用教程,苹果也正式开启了全新的AppleMusic的无损音乐时代。在中国区一个月仅10元包年100元

    2023年05月23 249
  • tcl的电视怎么样

    老狐今天要和大家聊聊刚到货的一款电视。国庆前夕,TCL发布了新作V8G,一款到手价仅2299元起的百级分区高画质电视。一直准备买台新电视的老狐,在它亮相之前就予以重点关注。等TCL公布了价格和性能参数

    2023年05月29 225
  • 国际长途怎么开通,电信国际长途怎么开通

    全球通开通国际长途业务有以下几种方式:一、网站:1、登录中国联通网上营业厅,点击菜单“办理-国际业务办理-国际、港澳台长途”根据页面提示开通国际长途。2、下载并登录【中国联通手机营业厅】APP,点击菜

    2023年05月15 224
  • 怎样加盟美团网站,美团站点怎么加盟

    美团外卖是国内知名的团购外卖网站。经过多年的发展,美团站点怎么加盟,网络规模不断扩大,网点覆盖200多个城市,给投资者带来了良好的发展机遇,吸引了众多投资者的关注。很多创业者开便利店都想进美团外卖。开

    2023年01月03 213
  • 怎样更改实名认证

    和平精英是需要实名认证的,如果实名认证填写错误了,很多玩家不知道怎样才能开启重新实名,对于重新实名认证的方法很多玩家不太了解,2022因异地登录频繁人脸识别,那么和平精英怎么重新实名认证?和平精英怎么

    2022年12月28 273
  • 天文望远镜怎么用,天文望远镜使用图解教程

    宇宙奥秘知多少,购买望远镜吧,让眼睛亲自告诉你!望远镜购买指南随着度假季将至,很多人会考虑购买望远镜。没准你已经在报纸、目录或者电视购物频道中看到过望远镜的广告。有一类广告也许是这样说的:“宇宙奥秘近

    2023年05月29 282
  • 万用表怎么测正负极,万用表怎样测直流正负极

    关注“技成微课堂”,一起涨知识~私信回复:10,领10款电工仿真软件!万用表分两种,一种是数字显示的电子万能表,还有一种是指针显示的动圈表。不管哪种表,它一般都具有测量交直流电压,交直流电流,电阻等功

    2023年06月01 218
  • 微博怎样注销帐号,怎样注销新浪微博账号

    微博作为近些年来迅速发展起来的社交网络平台,越来越受到人们的追捧,但随之而来的问题是广告等垃圾信息漫天飞舞,于是也有越来越多人因受不了广告等垃圾信息的烦扰而选择关闭微博账号。但是新浪公司迟迟没有推出微

    2023年01月07 263
  • qq怎样绑定身份证,qq有必要绑定身份证吗

    [海峡网]在【和平精英】试点运行的“16+”将对未满16周岁的玩家进行登录限制,qq有必要绑定身份证吗,那么和平精英身份证怎么改?和平精英身份证怎么解绑?下面和小编一起去了解一下吧。,和平精英身份证怎

    2023年01月03 280
  • apk文件怎么安装,apk经过QQ浏览器才能安装

    很多学习安卓逆向的朋友大多都会卡在安卓apk上,apk经过QQ浏览器才能安装,今天小生就来给大家讲解一下,安装apk的流程,希望能帮助到大家。安装方式:微信发送apk的方法:\x0d\x0a在手机含有

    2023年01月11 242
  • 怎样把文档发到微信上,文档怎么用微信发给别人

    大家好,这期教大家如何把电脑文件夹压缩发送至微信。很多人觉得压缩文件不是很简单的事情吗,这个也需要单独教吗?会不会觉得我是在侮辱你的智商?不过,我相信,今天教你的内容大多数人还是真不会的。那么,究竟电

    2022年12月31 295
关注微信