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

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

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

package study.reflect;

import java.io.InputStream;

import java.util.List;

public class Person

{

    /**

     * 为了测试用

     */

    public String name = "test";

    public Person()

    {

    }

    public Person(String name)

    {

       System.out.println("name:"+name);

    }

    public Person(String name,int age)

    {

       System.out.println("name:"+name+",age:"+age);

    }

    private Person(List list)

    {

       System.out.println("list");

    }

    public void sayHello()

    {

       System.out.println("hello");

    }

    public void sayHello(String name)

    {

       System.out.println("hello,"+name);

    }

    public String sayHello(String name,int age)

    {

       System.out.println("hello,"+name+",age:"+age);

       return name;

    }

    private void sayHello(InputStream in)

    {

       System.out.println("inputStream");

    }

    public static void sayHello(Person person)

    {

       System.out.println(person);

    }

}

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

package study.reflect;

import java.io.FileInputStream;

import java.io.InputStream;

import java.lang.reflect.Method;

import org.junit.Test;

/**

 * 解析类,并调用方法

 * @author Pony

 *

 */

public class Demo03

{

    @Test

    public void test01() throws Exception

    {

       Class<?> clazz = Class.forName("study.reflect.Person");

       Person person = (Person) clazz.newInstance();

       Method method = clazz.getMethod("sayHello", null);

       method.invoke(person, null);

    }

    @Test

    public void test02() throws Exception

    {

       Class<?> clazz = Class.forName("study.reflect.Person");

       Person person = (Person) clazz.newInstance();

       Method method = clazz.getMethod("sayHello", String.class);

       method.invoke(person, "world");

    }

    @Test

    public void test03() throws Exception

    {

       Class<?> clazz = Class.forName("study.reflect.Person");

       Person person = (Person) clazz.newInstance();

       Method method = clazz.getMethod("sayHello", String.class,int.class);

       method.invoke(person, "world",12);

    }

    @Test

    public void test04() throws Exception

    {

       Class<?> clazz = Class.forName("study.reflect.Person");

       Person person = (Person) clazz.newInstance();

       Method method = clazz.getMethod("sayHello",Person.class);

       method.invoke(person,person);

    }

    @Test

    public void test05() throws Exception

    {

       Class<?> clazz = Class.forName("study.reflect.Person");

       Person person = (Person) clazz.newInstance();

       Method method = clazz.getDeclaredMethod("sayHello",InputStream.class);

       method.setAccessible(true);

       method.invoke(person,new FileInputStream("D:\\1.txt"));

    }

}

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

如果person 中有如下的方法:

    public static void main(String[] args) {

       System.out.println("main");

    }

如果向下面方式:

@Test

    public void test06() throws Exception

    {

       Class<?> clazz = Class.forName("study.reflect.Person");

       //Person person = (Person) clazz.newInstance();

       Method method = clazz.getMethod("main",String[].class);

       //静态方法,所以可以直接传空

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

    }

会出现一个下面的错误:

java.lang.IllegalArgumentException: wrong number of arguments

       at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

       at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)

       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. nginx 简介  http://nginx.org

    Nginx(一) 官方技术文档网站:http://nginx.org Nginx的特性 1:各功能基于模块化设计,扩展性好   2:支持平滑重启,实现应用不下线部署   3:在多并发请求模型下,内存消 ...

  2. jquery截取手机号中间4位数,然后变为*

    $(function() { var phone = $('#phone').text(); var mphone = phone.substr(0, 3) + '****' + phone.subs ...

  3. 【Python】Python发展历史

    起源 Python的作者,Guido von Rossum,荷兰人.1982年,Guido从阿姆斯特丹大学获得了数学和计算机硕士学位.然而,尽管他算得上是一位数学家,但他更加享受计算机带来的乐趣.用他 ...

  4. 洛谷 P4116 Qtree3

    Qtree系列第三题 我是题面 读完题大概不难判断是一道树剖的题 这道题的关键是记录两种状态,以及黑点的序号(不是编号) 线段树啊当然 定义两个变量v,f,v表示距离根节点最近的黑点,默认-1,f则表 ...

  5. [AT2557] [arc073_c] Ball Coloring

    题目链接 AtCoder:https://arc073.contest.atcoder.jp/tasks/arc073_c 洛谷:https://www.luogu.org/problemnew/sh ...

  6. Unity3D手游开发日记(5) - 适合移动平台的植被随风摆动

    一直在思考怎么让场景更有生机,我觉得植被的随风摆动是必不可少的.CE3引擎的植被bending就做得特别棒.我也准备在手机上做一套. 先分析一下植被摆动常见的几种做法.其实不管哪种做法,核心就是让植被 ...

  7. NOIP2017结束了

    NOIP 2017 两天T1总分80 D1T3爆零 学军数据255 洛谷数据270 大概连1=都没有吧 没有预料到的结果 想了很久 最后只能选择接受 看完成绩单 高二爷们也许只剩下CYC LLQ ZS ...

  8. 最近公共祖先(LCA)(题目)

    Time Limit: 2000 ms Memory Limit: 256 MB Description Input Output Sample Input 15 5 1 2 3 4 5 6 7 8 ...

  9. 对于redis底层框架的理解(五)

    之前总结了redis的通讯流程,基本框架,epoll的封装等等,这次介绍下 redis对于select模型的封装 //select 模型 typedef struct aeApiState { //读 ...

  10. dmsg命令使用

    http://note.youdao.com/noteshare?id=6771284da9f10ac35652907898d63141