`
liss
  • 浏览: 824919 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

java反射中Method类invoke方法的用法

阅读更多
2010年04月13日 下午 04:43
  1. import java.lang.reflect.Method;   
  2.   
  3. public class InvokeTester {   
  4.   
  5. public int add(int param1, int param2) {   
  6.   return param1 + param2;   
  7. }   
  8.   
  9. public String echo(String mesg) {   
  10.   return "echo" + mesg;   
  11. }   
  12.   
  13. public static void main(String[] args) throws Exception {   
  14.    Class classType = InvokeTester.class;   
  15.    Object invokertester = classType.newInstance();    //下面介绍与new 的区别
  16.      
  17.    Method addMethod = classType.getMethod("add", new Class[] { int.class,   
  18.     int.class });   
  19.   //Method类的invoke(Object obj,Object args[])方法接收的参数必须为对象,   
  20.   //如果参数为基本类型数据,必须转换为相应的包装类型的对象。invoke()方法的返回值总是对象,   
  21.   //如果实际被调用的方法的返回类型是基本类型数据,那么invoke()方法会把它转换为相应的包装类型的对象,   
  22.   //再将其返回   
  23.    Object result = addMethod.invoke(invokertester, new Object[] {   
  24.     new Integer(100), new Integer(200) });   
  25.   //在jdk5.0中有了装箱 拆箱机制 new Integer(100)可以用100来代替,系统会自动在int 和integer之间转换   
  26.    System.out.println(result);   
  27.   
  28.    Method echoMethod = classType.getMethod("echo",   
  29.     new Class[] { String.class });   
  30.    result = echoMethod.invoke(invokertester, new Object[] { "hello" });   
  31.    System.out.println(result);   
  32. }   
  33. }  

//==================================

newInstance()方法和new关键字除了一个是方法,一个是关键字外,最主要有什么区别?它们的区别在于创建对象的方式不一样,前者是使用类加载机制,后者是创建一个新类。那么为什么会有两种创建对象方式?这主要考虑到软件的可伸缩、可扩展和可重用等软件设计思想。
我们使用关键字new创建一个类的时候,这个类可以没有被加载。但是使用newInstance()方法的时候,就必须保证:1、这个类已经加载;2、这个类已经连接了。

newInstance()实际上是把new这个方式分解为两步,即首先调用Class加载方法加载某个类,然后实例化。 这样分步的好处是显而易见的。我们可以在调用class的静态加载方法forName时获得更好的灵活性,提供给了一种降耦的手段。

最后用最简单的描述来区分new关键字和newInstance()方法的区别:
newInstance: 弱类型。低效率。只能调用无参构造。
new: 强类型。相对高效。能调用任何public构造。

分享到:
评论

相关推荐

    Java 反射(Reflection) 经典实用例子

    Java提供了一套机制来动态执行方法和构造方法,以及数组操作等,这套机制就叫——反射。反射机制是如今很多流行框架的实现基础,其中包括Spring、Hibernate等。原理性的问题不是本文的重点,接下来让我们在实例中...

    Java使用反射调用方法

    在使用反射可以得到类模板class对象,那么得到类模板的class对象后,如何调用某个已知的且需要的方法呢?答案是使用method类的invoke方法,那么实现的代码如下,结合jdk的api和该代码便可以知道原理 package ...

    Java开发技术大全(500个源代码).

    DumpMethods.java 使用反射机制来获取类中的方法 getClassName.java 利用反射机制获取类的名字 invokeConstructor.java 利用反射机制调用构造器 invokeMethod.java 利用反射机制调用成员方法 listConstructors....

    java框架知识点汇总(反射,XML,设计模式,Redis缓存数据库)

    Java 反射机制是在运行状态中,对于任意一个类,都能够获得这个类的所有属性和方法,对于任意一个对象都能够调用它的任意一个属性和方法。这种在运行时动态的获取信息以及动态调用对象的方法的功能称为 Java 的反射...

    Java 高级特性.doc

    先建这样的一个类,带会下面有个类里面有反射成员变量的方法的! public class ReflectPoint { private int x; public int y; public ReflectPoint(int x, int y) { super(); this.x = x; this.y = y; } } ...

    day021-反射和注解笔记和代码.rar

    Class类中方法newInstance():创建当前字节码对象(只能调用无参且是public修饰的构造方法) 2. 根据字节码文件获取构造方法、普通方法、字段等 构造方法 Constructor[] constructors...

    Java反射学习笔记

    获取类内部信息2.1 构造函数2.1.1 获取构造函数2.1.2 使用构造函数构造实例2.2 Field 对象2.2.1 获取 Field 对象2.2.2 Field 的 set,get 操作2.3 Method 对象2.2.1 获取 Method 对象2.2.2 Method 的 invoke 操作3....

    java实现校园一卡通源码-SpringBoot:弹簧靴

    通过ApplicationContext获取模块对象,使用反射method.invoke执行真正的调用方法. 在ResponseHandlerAspect与ApiRecordAspect两个切面中分别对请求结果包装以及请求访问日志记录, 使用JWT为登录用户颁发Token,在...

    java实现校园一卡通源码-vn-server2:vn-server2

    通过ApplicationContext获取模块对象,使用反射method.invoke执行真正的调用方法. 在ResponseHandlerAspect与ApiRecordAspect两个切面中分别对请求结果包装以及请求访问日志记录, 使用JWT为登录用户颁发Token,在...

    easybus:没有反射的快速事件总线

    我见过的所有实现的主要缺点是它们都使用反射来调用侦听器方法,即Method.invoke() 。 不幸的是,这种方法在低延迟世界中是不可接受的,因此我决定使用优秀的 OpenHFT/Java-Runtime-Compiler 库来代替在运行时为...

    ReflectionUtil:反射工具包

    所有的命令最终生成到Invoker对象的invoke方法中 public Object invoke(Object[] args); 具体使用如下: InvokerBuilder builder=InvokerBuilder.getInstance(); Method concat = String.class.getMethod("concat", ...

    Lua解析器mLua.zip

    ...)构造一个java实例,参数className是import函数的返回值,后续参数为java构造方法的输入参数invokeStatic(className, methodName, ...)调用一个java的静态方法invoke(receiver, methodName, ...)调用一个Java的...

    Android渠道打包工具packer-ng-plugin.zip

    解决方法由于使用Java直接写入和读取ZIP文件的注释都不可行,使用Python又不方便与Gradle系统集成,所以只能自己实现注释的写入和读取。 实现起来也不复杂,就是为了提高性能,避免读取整个文件,需要在注释的最后...

    Spring.net框架

    在上面这段代码中,重点注意三条命令的使用方法: assembly = Assembly.LoadFile(rootPath + prop.assemblyName); p = assembly.CreateInstance(prop.typeName); t.InvokeMember(prop.propertyName, BindingFlags....

Global site tag (gtag.js) - Google Analytics