大家都知道反射技术在Java里面时非常重要的一个技术点,因为Java好多框架的编写都是基于反射的,别的不多说,spring框架里面的IOC就是基于反射实现。那么什么是反射呢?JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。说白了,反射就是加载类,并且反射出类的各个组成部分的一种实现方式。

java是一种面向对象的语言,所以我们处理任何东西,第一反应就是去找对象,并且调用它内部封装的方法。接下来我们演示如何通过反射来获取一个类中的方法,并执行该方法。

1.定义一个简单Person类

package com.day09;

public class Person {

    public void show() {
System.out.println("I am zhangsan and my age is 1");
} public void show(String name) {
System.out.println("I am " + name);
} public void show(String name, int age) {
System.out.println("I am " + name + " and my age is " + age);
} private void show(String[] hobbies) {
System.out.println("my hobby such as: ");
for (String hobby : hobbies) {
System.out.println(hobby);
}
} public String getNameAndAge() {
return "zhangsan:32";
} public static void speak() {
System.out.println("I am a person");
} public static void main(String[] args) {
System.out.println("this is main!");
}
}

2.利用Junit来演示进行演示测试

package com.day09;

import java.lang.reflect.Method;

import org.junit.Test;

public class ReflectMethodDemo {
/*
* 反射普通的无参方法 public void show()
*/
@Test
public void reflectNoParameter() throws Exception {
// 将类加载如内存
Class<?> clazz = Class.forName("com.day09.Person");
// 传入方法的名称和方法的参数信息,得到我们需要的方法
Method method = clazz.getMethod("show", null);
// 需要传入调用的对象,并传入方法参数,并运行该方法
method.invoke(clazz.newInstance(), null);
} /*
* 反射普通的方法 public void show(String name)
*/
@Test
public void reflectOneParameter() throws Exception {
// 将类加载如内存
Class<?> clazz = Class.forName("com.day09.Person");
// 传入方法的名称和方法的参数信息,得到我们需要的方法
Method method = clazz.getMethod("show", String.class);
// 需要传入调用的对象,并传入方法参数,并运行该方法
method.invoke(clazz.newInstance(), "马里奥");
} /*
* 反射普通的方法public void show(String name, int age)
*/
@Test
public void reflectManyParameter() throws Exception {
// 将类加载如内存
Class<?> clazz = Class.forName("com.day09.Person");
// 传入方法的名称和方法的参数信息,得到我们需要的方法
Method method = clazz.getMethod("show", String.class, int.class);
// 需要传入调用的对象,并传入方法参数,并运行该方法
method.invoke(clazz.newInstance(), "马里奥", 100);
} /*
* 反射普通的私有方法 private void show(String[] hobbies)
*/
@Test
public void reflectPrivateParameter() throws Exception {
// 将类加载如内存
Class<?> clazz = Class.forName("com.day09.Person");
// 因为是私有方法,所以要用传入方法的名称和方法的参数信息,得到我们需要的方法
Method method = clazz.getDeclaredMethod("show", String[].class);
// 因为是私有方法,需要打开权限,设为可见
method.setAccessible(true);
// 需要传入调用的对象,并传入方法参数,并运行该方法new String[] { "游泳", "跑步", "健身", "篮球" }
method.invoke(clazz.newInstance(), new Object[] { new String[] { "游泳", "跑步", "健身", "篮球" } });
} /*
* 反射普通的无参方法public String getNameAndAge()
*/
@Test
public void reflectReturnValue() throws Exception {
// 将类加载如内存
Class<?> clazz = Class.forName("com.day09.Person");
// 传入方法的名称和方法的参数信息,得到我们需要的方法
Method method = clazz.getMethod("getNameAndAge", null);
// 需要传入调用的对象,并传入方法参数,并运行该方法,用一个object对象接收参数
Object obj = method.invoke(clazz.newInstance(), null);
System.out.println(obj);
} /*
* 反射静态方法 public static void speak()
*/
@Test
public void reflectStatic() throws Exception {
// 将类加载如内存
Class<?> clazz = Class.forName("com.day09.Person");
// 传入方法的名称和方法的参数信息,得到我们需要的方法
Method method = clazz.getMethod("speak", null);
// 因为是静态方法,所以可以不传对象,直接null就行,并传入方法参数,并运行该方法
method.invoke(null, null);
} /**
* 反射main方法
*
* @throws SecurityException
* @throws NoSuchMethodException
*
*/
@Test
public void reflectMain() throws Exception {
// 将类加载如内存
Class<?> clazz = Class.forName("com.day09.Person");
// 传入方法的名称和方法的参数信息,得到我们需要的方法
Method method = clazz.getMethod("main", String[].class);
// 因为是静态方法,所以可以不传对象,直接null就行,并传入方法参数,并运行该方法
method.invoke(null, new Object[1]);
} }

至此,我们已将常见的几种通过反射获取对象方法,并运行方法演示完毕,有不足的地方,希望大家多多提意见!

java反射——方法的更多相关文章

  1. 【译】5. Java反射——方法

    原文地址:http://tutorials.jenkov.com/java-reflection/methods.html ====================================== ...

  2. Java反射-方法(Method)

    工作了三年,第二次使用反射! 遇到的问题描述: 多个页面查询后,返回的List中的对象属性为“.00”,页面显示不友好. 查询原因是因为查询数据的SQL为:to_char(a.applyAmount, ...

  3. Java 反射 方法调用

    在使用Java 反射时,对方法的调用,可能碰到最多的问题是,方法的变量如何使用.其实,调用方法的变量全部在参数数组里,不管有多少个参数,你都要把它放在参数数组里,如果是单个非数组参数,则可不使用参数数 ...

  4. java反射--方法反射的基本操作

    方法的反射 1)如何获取某个方法 方法的名称和方法的参数列表才能唯一决定某个方法. 2)方法反射的操作 method.invoke(对象,参数列表). 代码实例: package com.reflec ...

  5. Java反射方法总结

    1.得到构造器的方法 Constructor getConstructor(Class[] params) -- 获得使用特殊的参数类型的公共构造函数, Constructor[] getConstr ...

  6. 【译】7. Java反射——私有字段和私有方法

    原文地址:http://tutorials.jenkov.com/java-reflection/private-fields-and-methods.html =================== ...

  7. Java 反射机制学习资料

    Java反射——引言 Java反射——Class对象 Java反射——构造函数 Java反射——字段 Java反射——方法 Java反射——Getter和Setter Java反射——私有字段和私有方 ...

  8. Java反射——引言

    Java反射——引言 原文地址:http://tutorials.jenkov.com/java-reflection/index.html *By Jakob Jenkov Java的反射机制使得它 ...

  9. 【译】1. Java反射——引言

    原文地址:http://tutorials.jenkov.com/java-reflection/index.html *By Jakob Jenkov Java的反射机制使得它可以在运行时检查类.接 ...

随机推荐

  1. 三款免费的PHP加速器:APC、eAccelerator、XCache比较

    前几天给 Nova 的缓存系统添加了 Memcache 支持.但是这玩意儿对个人博客系统来说可能不太合适(哪天 XKLog 推出多用户版本了可能会派上用场),事实上,就我自己试用而言,单机情况下使用 ...

  2. Application Architecture Determines Application Performance

     Application Architecture Determines Application Performance Randy Stafford AppliCATion ARCHiTECTuR ...

  3. 使用jquery dialog

    网页开发中,弹窗还是很有必要的.本人比较喜欢jquery ui的dialog. 但是jquery dialog中也有一些略显不方便的,如:没有z-index的参数设置,脚部的按钮样式没办法自定义…… ...

  4. JS事件类型详解

    一般事件 onclick IE3.N2 鼠标点击时触发 此事件 ondblclick IE4.N4 鼠标双击时触发 此事件 onmousedown IE4.N4 按下鼠标时触发 此事件 onmouse ...

  5. 0050 MyBatis关联映射--一对多关系

    一对多关系更加常见,比如用户和订单,一个用户可以有多个订单 DROP TABLE IF EXISTS customer; /*用户表*/ CREATE TABLE customer( `pk` INT ...

  6. FileStream常用的属性和方法 (转)

    对流进行操作时要引用 using System.IO; 命名空间 FileStream常用的属性和方法: 属性: CanRead 判断当前流是否支持读取,返回bool值,True表示可以读取 CanW ...

  7. 跑测试没有web环境的情况

    有时候 当你跑测试的main方法的时候,会有一些莫名其妙的错误,明明mave pom的包是全的,web跑起来不会报错,可是在main方法下就是报错了,这个时候引入  <dependency> ...

  8. oracle中查看正在运行的并行进程

    select count(*) from v$px_process a where a.STATUS='IN USE';

  9. linux学习笔记30--网络命令ifconfig

    许多windows非常熟悉ipconfig命令行工具,它被用来获取网络接口配置信息并对此进行修改.Linux系统拥有一个类似的工具,也就是ifconfig(interfaces config).通常需 ...

  10. 用C/C++扩展你的PHP 为你的php增加功能

    英文版下载: PHP 5 Power Programming http://www.jb51.net/books/61020.html PHP取得成功的一个主要原因之一是她拥有大量的可用扩展.web开 ...