Java Reflection(五):方法

原文地址 作者: Jakob Jenkov 译者:叶文海(yewenhai@gamil.com)
内容索引
获取Method对象
方法参数以及返回类型
通过Method对象调用方法

使用Java反射你可以在运行期检查一个方法的信息以及在运行期调用这个方法,通过使用java.lang.reflect.Method类就可以实现上述功能。在本节会带你深入了解Method对象的信息。

获取Method对象

可以通过Class对象获取Method对象,如下例:

   Class aClass = ...//获取Class对象
   Method[] methods = aClass.getMethods();

返回的Method对象数组包含了指定类中声明为公有的(public)的所有变量集合。
如果你知道你要调用方法的具体参数类型,你就可以直接通过参数类型来获取指定的方法,下面这个例子中返回方法对象名称是“doSomething”,他的方法参数是String类型:

   Class  aClass = ...//获取Class对象
   Method method = aClass.getMethod("doSomething", new Class[]{String.class});

如果根据给定的方法名称以及参数类型无法匹配到相应的方法,则会抛出NoSuchMethodException。
如果你想要获取的方法没有参数,那么在调用getMethod()方法时第二个参数传入null即可,就像这样:

   Class  aClass = ...//获取Class对象
   Method method = aClass.getMethod("doSomething", null);

方法参数以及返回类型

你可以获取指定方法的方法参数是哪些:

   Method method = ... //获取Class对象
   Class[] parameterTypes = method.getParameterTypes();

你可以获取指定方法的返回类型:

   Method method = ... //获取Class对象
   Class returnType = method.getReturnType();

通过Method对象调用方法

你可以通过如下方式来调用一个方法:

   //获取一个方法名为doSomesthing,参数类型为String的方法
   Method method = MyObject.class.getMethod("doSomething", String.class);
   Object returnValue = method.invoke(null, "parameter-value1");

传入的null参数是你要调用方法的对象,如果是一个静态方法调用的话则可以用null代替指定对象作为invoke()的参数,在上面这个例子中,如果doSomething不是静态方法的话,你就要传入有效的MyObject实例而不是null。
Method.invoke(Object target, Object … parameters)方法的第二个参数是一个可变参数列表,但是你必须要传入与你要调用方法的形参一一对应的实参。就像上个例子那样,方法需要String类型的参数,那我们必须要传入一个字符串。

时间: 2024-10-03 15:51:11

Java Reflection(五):方法的相关文章

Java Reflection API简介

Java Reflection API提供对JVM中的类,接口和对象的深入洞察.开发者通常使用API来完成以下的任务,这解释了为什么总是使用开发工具,例如debugger和Integrated Development Environments (IDEs): · 决定一个对象的类. · 获得关于一个类的modifiers, fields, methods, constructors, etc的信息. · 获得关于一个接口的常量和方法声明. · 创建一个类的instance,这个类的名字直到运行时

JAVA中toString方法的作用

以下是对在JAVA中toString方法的作用进行了详细的分析介绍,需要的朋友可以参考下   因为它是Object里面已经有了的方法,而所有类都是继承Object,所以"所有对象都有这个方法". 它通常只是为了方便输出,比如System.out.println(xx),括号里面的"xx"如果不是String类型的话,就自动调用xx的toString()方法 总而言之,它只是sun公司开发java的时候为了方便所有类的字符串操作而特意加入的一个方法  回答补充:写这个

java中同一个方法可以被几个类或者被几个对象共享

问题描述 java中同一个方法可以被几个类或者被几个对象共享 java中同一个方法可以被几个类或者被几个对象共享java中同一个方法可以被几个类或者被几个对象共享 解决方案 方法本质上是字节码序列,底层是指令集合.方法是通过对象调用的,对象是存储在堆中的,是所有线程共享的.方法是类型信息,不存在共享这个说法. 解决方案二: java 中的方法都是在类中的,而对于你说的方法可以被几个类或者几个对象共享,这个问题问的没有多大意义,方法属于类的方法,不会被共享,可以被子类复写和调用. 解决方案三: j

Java Reflection(九):泛型

内容索引运用泛型反射的经验法则泛型方法返回类型泛型方法参数类型泛型变量类型 我常常在一些文章以及论坛中读到说Java泛型信息在编译期被擦除(erased)所以你无法在运行期获得有关泛型的信息.其实这种说法并不完全正确的,在一些情况下是可以在运行期获取到泛型的信息.这些情况其实覆盖了一些我们需要泛型信息的需求.在本节中我们会演示一下这些情况. 运用泛型反射的经验法则 下面是两个典型的使用泛型的场景: 1.声明一个需要被参数化(parameterizable)的类/接口. 2.使用一个参数化类. 当

新手求问,关于JAVA的 String方法

问题描述 新手求问,关于JAVA的 String方法 这样子是输出还是 abcd没有用到转换大写的方法String s=""abcd"";s.toUpper();System.out.println(s); 这样子输出ABCD,用到了大写的方法String s=""abcd"";System.out.println(s.toUpper()); 为什么会这样呢 解决方案 新手求解求解求解求解求解求解 解决方案二: 建议从浅复制和

方法嵌套方法-java中非static方法内部能否嵌套非static方法?

问题描述 java中非static方法内部能否嵌套非static方法? class NiMingLei { public static void main(String[] args) { Outer a= new Outer(); a.function(); } } class Outer { static int y=4; void function() { void show() { System.out.println(123); } class Inter { void method(

java中toString方法干嘛用的

问题描述 java中toString方法干嘛用的 java中toString方法干嘛用的 为什么打印一个对象会自动调用该对象的 toString方法 该方法的应用场景是什么? 解决方案 你打印的时候,打印的对象必须是string,如果你对象不是这个类型,输入就会把这对象强制转换为string 不然他会报错. 解决方案二: 解决方案三: 百度就有,这个问题不是很难,百度资料很详细. 解决方案四: Java中的toString方法关于Java中的toString()方法java toString()

java中this.方法和方法有什么区别?

问题描述 java中this.方法和方法有什么区别? java中this.方法和方法有什么区别? 比如this.setContentView( )和单单写setContentView( )有何区别,谢谢解答 解决方案 this就是代表自身,默认可以不加 解决方案二: Lesson_for_java_day08--类的属性和方法.类的封装性.构造函数和this的使用Java在不同环境下获取当前路径的方法--this.getClass().getResource("")请问:Scanner

java类的问题-用java 写一个方法,能够判断任意整数是否是素数

问题描述 用java 写一个方法,能够判断任意整数是否是素数 用java代码写一个方法,能够判断任意整数是否是素数......... 解决方案 public class Num{ public static void main(String args[]){ int m; boolean tag=true; System.out.print("Please enter a num:"); try{ m=(int)System.in.read(); for(int i=m-1;i>