声明:如需转载请说明地址来源:http://www.cnblogs.com/pony1223

反射三 利用反射获取对象的方法,并调用方法

1.利用反射获取对象的方法,我们仍然利用上面的Person类,然后在里面建立方法,方法我们知道有无参方法,有参方法,私有方法,静态方法,如下所示:

  1. package study.reflect;
  2.  
  3. import java.io.InputStream;
  4.  
  5. import java.util.List;
  6.  
  7. public class Person
  8.  
  9. {
  10.  
  11. /**
  12.  
  13. * 为了测试用
  14.  
  15. */
  16.  
  17. public String name = "test";
  18.  
  19. public Person()
  20.  
  21. {
  22.  
  23. }
  24.  
  25. public Person(String name)
  26.  
  27. {
  28.  
  29. System.out.println("name:"+name);
  30.  
  31. }
  32.  
  33. public Person(String name,int age)
  34.  
  35. {
  36.  
  37. System.out.println("name:"+name+",age:"+age);
  38.  
  39. }
  40.  
  41. private Person(List list)
  42.  
  43. {
  44.  
  45. System.out.println("list");
  46.  
  47. }
  48.  
  49. public void sayHello()
  50.  
  51. {
  52.  
  53. System.out.println("hello");
  54.  
  55. }
  56.  
  57. public void sayHello(String name)
  58.  
  59. {
  60.  
  61. System.out.println("hello,"+name);
  62.  
  63. }
  64.  
  65. public String sayHello(String name,int age)
  66.  
  67. {
  68.  
  69. System.out.println("hello,"+name+",age:"+age);
  70.  
  71. return name;
  72.  
  73. }
  74.  
  75. private void sayHello(InputStream in)
  76.  
  77. {
  78.  
  79. System.out.println("inputStream");
  80.  
  81. }
  82.  
  83. public static void sayHello(Person person)
  84.  
  85. {
  86.  
  87. System.out.println(person);
  88.  
  89. }
  90.  
  91. }

2.通过反射我们要获取方法,并执行方法,代码如下:

  1. package study.reflect;
  2.  
  3. import java.io.FileInputStream;
  4.  
  5. import java.io.InputStream;
  6.  
  7. import java.lang.reflect.Method;
  8.  
  9. import org.junit.Test;
  10.  
  11. /**
  12.  
  13. * 解析类,并调用方法
  14.  
  15. * @author Pony
  16.  
  17. *
  18.  
  19. */
  20.  
  21. public class Demo03
  22.  
  23. {
  24.  
  25. @Test
  26.  
  27. public void test01() throws Exception
  28.  
  29. {
  30.  
  31. Class<?> clazz = Class.forName("study.reflect.Person");
  32.  
  33. Person person = (Person) clazz.newInstance();
  34.  
  35. Method method = clazz.getMethod("sayHello", null);
  36.  
  37. method.invoke(person, null);
  38.  
  39. }
  40.  
  41. @Test
  42.  
  43. public void test02() throws Exception
  44.  
  45. {
  46.  
  47. Class<?> clazz = Class.forName("study.reflect.Person");
  48.  
  49. Person person = (Person) clazz.newInstance();
  50.  
  51. Method method = clazz.getMethod("sayHello", String.class);
  52.  
  53. method.invoke(person, "world");
  54.  
  55. }
  56.  
  57. @Test
  58.  
  59. public void test03() throws Exception
  60.  
  61. {
  62.  
  63. Class<?> clazz = Class.forName("study.reflect.Person");
  64.  
  65. Person person = (Person) clazz.newInstance();
  66.  
  67. Method method = clazz.getMethod("sayHello", String.class,int.class);
  68.  
  69. method.invoke(person, "world",12);
  70.  
  71. }
  72.  
  73. @Test
  74.  
  75. public void test04() throws Exception
  76.  
  77. {
  78.  
  79. Class<?> clazz = Class.forName("study.reflect.Person");
  80.  
  81. Person person = (Person) clazz.newInstance();
  82.  
  83. Method method = clazz.getMethod("sayHello",Person.class);
  84.  
  85. method.invoke(person,person);
  86.  
  87. }
  88.  
  89. @Test
  90.  
  91. public void test05() throws Exception
  92.  
  93. {
  94.  
  95. Class<?> clazz = Class.forName("study.reflect.Person");
  96.  
  97. Person person = (Person) clazz.newInstance();
  98.  
  99. Method method = clazz.getDeclaredMethod("sayHello",InputStream.class);
  100.  
  101. method.setAccessible(true);
  102.  
  103. method.invoke(person,new FileInputStream("D:\\1.txt"));
  104.  
  105. }
  106.  
  107. }

3.特殊main方法如何调用:

  1. 如果person 中有如下的方法:
  2.  
  3. public static void main(String[] args) {
  4.  
  5. System.out.println("main");
  6.  
  7. }
  8.  
  9. 如果向下面方式:
  10.  
  11. @Test
  12.  
  13. public void test06() throws Exception
  14.  
  15. {
  16.  
  17. Class<?> clazz = Class.forName("study.reflect.Person");
  18.  
  19. //Person person = (Person) clazz.newInstance();
  20.  
  21. Method method = clazz.getMethod("main",String[].class);
  22.  
  23. //静态方法,所以可以直接传空
  24.  
  25. method.invoke(null,new String[]{"1","2"});
  26.  
  27. }
  28.  
  29. 会出现一个下面的错误:
  30.  
  31. java.lang.IllegalArgumentException: wrong number of arguments
  32.  
  33. at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  34.  
  35. at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
  36.  
  37. at

产生错误的原因为,在JDK1.4的时候是没有可变参数的因此,传入的是Object[] 数组的方式,那么JDK 拿到数组后就会拆分,这个时候new String[]{“1”,”2”},就会拆分成了两个String类型的参数,那么这个时候去Pesron 中,发现没有两个均为String类型的方法main,这个时候就会出现了上面的额参数个数不匹配,解决的方法为:

method.invoke(null,new String[]{"1","2"});

改成:

method.invoke(null,new Object[]{new String[]{"1","2"}});

这样拆完后,里面就一个参数了,对应到我们要的main上面;因此在遇到数组参数传递的时候需要注意。

JAVA中反射机制三的更多相关文章

  1. Java中反射机制和Class.forName、实例对象.class(属性)、实例对象getClass()的区别

    一.Java的反射机制   每个Java程序执行前都必须经过编译.加载.连接.和初始化这几个阶段,后三个阶段如下图:   其中

  2. JAVA中反射机制一

    反射一 基本概念 一.反射机制的基本概念 什么是反射?反射是指在运行状态中,对于任意一个类,都可以获取到这个类的所有属性和方法:对于任意一个对象,都能够调用这个对象的任意方法和属性:这种动态获取信息及 ...

  3. Java中反射机制详解

    序言 在学习java基础时,由于学的不扎实,讲的实用性不强,就觉得没用,很多重要的知识就那样一笔带过了,像这个马上要讲的反射机制一样,当时学的时候就忽略了,到后来学习的知识中,很多东西动不动就用反射, ...

  4. JAVA中反射机制五(java.lang.reflect包)

    一.简介 java.lang.reflect包提供了用于获取类和对象的反射信息的类和接口.反射API允许对程序访问有关加载类的字段,方法和构造函数的信息进行编程访问.它允许在安全限制内使用反射的字段, ...

  5. JAVA中反射机制六(java.lang.reflect包)

    一.简介 java.lang.reflect包提供了用于获取类和对象的反射信息的类和接口.反射API允许对程序访问有关加载类的字段,方法和构造函数的信息进行编程访问.它允许在安全限制内使用反射的字段, ...

  6. JAVA中反射机制四

    声明:如需转载请说明地址来源:http://www.cnblogs.com/pony1223 反射四 利用反射获取类的属性 1.通过反射也可以获取到类中的属性,假设我们继续使用Person这个类,然后 ...

  7. JAVA中反射机制五(JavaBean的内省与BeanUtils库)

    内省(Introspector) 是Java 语言对JavaBean类属性.事件的一种缺省处理方法. JavaBean是一种特殊的类,主要用于传递数据信息,这种类中的方法主要用于访问私有的字段,且方法 ...

  8. JAVA中反射机制二

    声明:如需转载请说明地址来源:http://www.cnblogs.com/pony1223 反射二 利用反射创建对象 1.利用反射创建对象,首先我们创建一个类,类里面,我们知道构造函数有默认的构造函 ...

  9. java中反射机制通过字节码文件对象获取字段和函数的方法

    pclass = Class.forName("get_class_method.Person"); //Field ageField = pclass.getField(&quo ...

随机推荐

  1. DP---(POJ1159 POJ1458 POJ1141)

    POJ1159,动态规划经典题目,很适合初学者入门练手. 求:为了使字符串左右对称,应该插入的最小字符数目. 设字符串为S1 S2 S3 - Sn. 这个字符串有n个字符,根据DP的基本思路,减少问题 ...

  2. C++ Primer Plus学习:第十五章

    第十五章 友元.异常和其他 友元 友元类 表 0-1 class Tv { public: friend class Remote; } Remote类可以使用Tv的数据成员,Remote类在Tv类后 ...

  3. opencv 矩阵类数据的运算

    参考:http://blog.sina.com.cn/s/blog_7908e1290101i97z.htmlhttp://blog.sina.com.cn/s/blog_afe2af380101bq ...

  4. [BinaryTree] 二叉树常考知识点

    1.二叉树第i层至多有2^(i-1)个结点(i>=1). 2.深度为k的二叉树上,至多含2^k-1个结点(k>=1) 3.n0 = n2 + 1(度) 4.满二叉树:深度为k且含有2^k- ...

  5. TestNG套件测试

    TestNG套件测试 测试套件的测试是为了测试软件程序的行为或一系列行为的情况下,是一个集合.在TestNG,我们不能定义一套测试源代码,但它代表的套件是一个XML文件执行特征.这也允许灵活的配置要运 ...

  6. BZOJ5091 摘苹果(概率期望)

    大胆猜想每一步都相当于是第一步.稍微验证一下发现是对的.就做完了. #include<iostream> #include<cstdio> #include<cmath& ...

  7. 贪心(qwq)习题题解

    贪心(qwq)习题题解 SCOI 题解 [ SCOI2016 美味 ] 假设已经确定了前i位,那么答案ans一定属于一个区间. 从高位往低位贪心,每次区间查找是否存在使此位答案为1的值. 比如6位数确 ...

  8. 聊聊flink Table的groupBy操作

    本文主要研究一下flink Table的groupBy操作 Table.groupBy flink-table_2.11-1.7.0-sources.jar!/org/apache/flink/tab ...

  9. Classical Binary Search

    Find any position of a target number in a sorted array. Return -1 if target does not exist. 与题目 Firs ...

  10. Zabbix概术及基础介绍(一)

    一.Zabbix介绍 Zabbix 是由Alexei Vladishev创建,目前由Zabbix SIA在持续开发和支持.Zabbix 是一个企业级的分布式开源监控方案.Zabbix是一款能够监控各种 ...