大家都知道反射技术在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. MySQL之mysql客户端工作的批处理一些使用手法

    通常我们会用mysql这个客户端程序来连接mysql库.这个通常是工作在交互式模式下的.如我们连接上mysql并执行如下操作: mysql -uroot -h127. -P3306 Welcome t ...

  2. Linux学习一

    1.Linux的优缺点: 长处: 稳定的系统 免费或少许费用 安全性,漏洞的高速修补 多任务,多用户 用户与用户的规划 相对不耗资源的系统 适合须要小内核的嵌入式系统 整合度佳且多样的图形用户界面 缺 ...

  3. maven下载源码和java docs

    方法一: mvn dependency:sources mvn dependency:resolve -Dclassifier=javadoc The first command will attem ...

  4. HTTP认证机制

    HTTP的询问/应答机制 如下图: 一个实例的图: 1.客户端请求资源 2.服务器对用户进行询问,在WWW-Authenticate首部中指明在哪里,如何进行认证 3.客户端会在Authenticat ...

  5. poj Buy Tickets

    题目链接:http://poj.org/problem?id=2828 类似的题目:http://www.cnblogs.com/lovychen/p/3674048.html 测试数据: in: 4 ...

  6. 什么是ETag

    ETag 是 Entity Tag 的缩写,中文译过来就是实体标签的意思.在HTTP1.1协议中其实就是请求HEAD中的一个属性而已. HTTP/1.1 200 OK Date: Mon, 23 Ma ...

  7. 档案 & 权限管理

    1. owner, group, others root 是万能的天神 权限 连结档 owner group 容量 修改日期 档名 2. chown, chgrp, chmod chgrp –R ro ...

  8. Oracle启动中,spfile.ora、init<SID>.ora、spfile<SID>.ora 这三个文件正确的先后顺序是什么?

    Oracle启动中,spfile.ora.init<SID>.ora.spfile<SID>.ora 这三个文件正确的先后顺序是什么? 解答:启动数据库,使用startup命令 ...

  9. Servlet Servlet是Java平台上的CGI技术

    Servlet Servlet是Java平台上的CGI技术.Servlet在服务器端运行,动态地生成Web页面.与传统的CGI和许多其它类似CGI的技术相比,Java Servlet具有更高的效率并更 ...

  10. Java 的数组

    几乎所有程序设计语言都支持数组.在C和 C++里使用数组是非常危险的,因为那些数组只是内存块.若程 序访问自己内存块以外的数组,或者在初始化之前使用内存(属于常规编程错误),会产生不可预测的后果 (注 ...