java的反射Reflect机制之Method篇

                       最近刚刚开始接触java的反射API,然后使用对j2EE或j2ME中许多框架的设计中有了一个大概的实现途径。现就自己学习到的知识做一个归纳。以后自己也会继续写java Reflect 机制的文章。

         Reflect更改介绍:我们可以将java中的各种各样的部分看成是一个一个的对象---也就将类(class)中的各种各种的成分(例如,方法、属性、构造函数、描述符)映射成一个一个的类(Class)。

        重要的类:

     Method   指类中的方法对象

     Field       指类中的属性对象

     constructor  指类中的构造函数对象

     modifier    指类中的修饰符对象

     Class        指某个类的字节码文件对象-----注意,我个人理解,一个类的字节码文件在内存中只有一份,不会有多余的一份。之所以有很多这个类的对象,那是因为JVM用这个字节码文件创建了多个相对应的对象。如下的代码,就能验证这个说法:其输出结果就是true。虽然是不同的对象,但是这两个对象对应的字节码文件是相同的。也就是说都是指向同一个字节码文件对象。总结:我们可以把这个Class对象看作是一个字节码文件对象,在JVM中的只有一份字节码文件对象,不会出现重名的字节码文件,因为java语言的包机制是不允许的,字节码文件是以类全名存于JVM中的。

String string="da"; String string2="dafd"; System.out.println(string.getClass()==string2.getClass());

    Method类中的重要的方法简介及其需要主要的点儿:

   1、得到一个method对象的方法:oneclassobj.getDeclaredMethod(methodname,methodparaType)  (注意:methodname值是必须指定的,methodParaType可以为null,因为某些方法是不需要参数的。如果methodparatype为null的话,那么在调用这个方法的时候一定不要再为这个方法添加参数,否则就回报错。)

   1、invoke(majorobj,values)   majorobj:方法所属的对象,也可以为null(当这个方法是static类型的时候,因为static方法是不属于某个对象的,是属于类的)。

    Class[] parametertypes={char[].class,int.class,int.class};/* 将要调用的方法的参数类型,注意:不能省略重复的参数类型。*/ Method method=String.class.getDeclaredMethod("copyValueOf",parametertypes);/*通过String类型的字节码文件对象得到指定的String中的方法*/ char[] onePara={'a','b','c'};/*怎样传送参数是一个难点*/ Object[] values={onePara,23,11};/*要点:因为参数有可能是0、一个或者是多个,,每一个参数作为Object数组的一个值。(注意:这里的参数的类型一定要与parameterTypes相同,顺序也要相同,否则就会报找不到这个方法的错误)*/ method.invoke(null,values);/**因为valueOf()是一个静态方法,所有不用指定对象,因为这个方法属于字节码文件的,只要指定了这个method是属于哪一个字节码文件就可以。*/

 

     在编程的过程中要注意的几点:

  1、从某个类文件中得到什么样的方法(参数的类型,参数的个数),那么在调用(invoke方法)这个方法的时候也要注意参数类型、参数个数的匹配。

2、当方法有多个参数,参数的传递是个难点。当没有参数时,调用方法时就不用指定参数类型(设置为null),。总结如下,我们可以通过代码展示

客户端代码:

private static void case3() throws Exception { Class[] parameterTypes = { String[].class, String.class }; String[] strings = { "yang", "xiao", "yu" };/*方法中的一个参数*/ Object[] values = { strings, "gong" };/*这才是所有的真正的参数值*/ fou = GetRunTime.getRunTime(Operation.class, "showContentOfArray", parameterTypes, values); }

业务代码:

package cn.hotbain.demo.get_run_time; import java.lang.reflect.Method; import java.util.Calendar; import java.util.Date; public class GetRunTime { private static long firtime; private static long lasttime; public static long getRunTime(Class classtype, String methodname, Class[] parametertypes, Object[] values) throws Exception { Calendar time=Calendar.getInstance(); // 第一步得到系统时间firtime firtime = System.currentTimeMillis(); // 运行指定的方法 //得到一个对象实例 Object object = classtype.newInstance(); //(根据方法名和参数类型class)得到这个类声明的所有的方法 Method method = classtype.getDeclaredMethod(methodname, parametertypes); method.invoke(object, values); // 得到当前的时间lasttime lasttime=System.currentTimeMillis(); // ruturn lasttime-firtime; return lasttime-firtime; } }

你可能感兴趣的:(Java基础)