大家都知道反射技术在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. List与String的相互转换

    List转字符串,用逗号隔开 List<string> list = new List<string>(); list.Add("a"); list.Add ...

  2. Java并发编程(六):Java里实现对象安全发布的四种方式

    接上篇,首先要了解什么是对象的发布与逸出? Java里安全发布对象的四种方法1.单例(注意懒汉和饿汉的区别)2.静态属性,注意类里的静态域和静态代码块的顺序有要求3.枚举4.final

  3. 编译JDK1.7

    1. 背景 想要一探JDK内部的实现机制,最便捷的路径之一就是自己编译一套JDK. 2. 获取JDK源码 从http://openjdk.java.net/下载源码,如 openjdk-6-src-b ...

  4. 多线程-Executor,Executors,ExecutorService,ScheduledExecutorService,AbstractExecutorService

    引用 系统启动一个新线程的成本是比较高的,因为涉及与操作系统交互.使用线程池可以很好地提高性能,尤其是当程序中需要创建大量生存期很短的线程时,更应该考虑使用线程池.线程池在系统启动时即创建大量空闲的线 ...

  5. [na] centos如何通过vmware Windows共享文件

    参考 自我感觉都会使用Windows中的文件.在Windows与linux之间互传文件是一个问题.本方法介绍的是在linux下挂载Windows共享文件夹的方法来实现的 首先安装VMware Tool ...

  6. 【c#】装箱与拆箱

    从内存执行的角度来看,值类型的内存分配在线程的堆栈上,而引用类型的内存分配在托管堆上.因此从值类型向引用类型的转换,势必牵涉到数据的拷贝与指针引用等操作. 装箱操作,大致过程为:在托管堆中分配新对象的 ...

  7. POJ 2472 106 miles to Chicago

    最短路问题变形. 题意是给你一些道路,和路过时不被抓的概率. 要求找一条到达目的地时不被抓的最大概率概率. 初始 dis[]设为 1 .其余为 0 .找最大就可以. #include<cstdi ...

  8. hadoop集群的配置文件

    export JAVA_HOME=/home/hadoop/apps/jdk1..0_131 1.hadoop-env.sh中配置JAVA_HOME export HADOOP_YARN_USER=/ ...

  9. 让一个 csproj 项目指定多个开发框架[转]

    原贴:https://walterlv.gitee.io/post/configure-projects-to-target-multiple-platforms.html 可移植类库.共享项目..N ...

  10. Github上Fork代码,及源码修改

    iOS开发中经常遇到这种情况,你使用的第三方库不能完全满足自己项目需要,只能修改源码来解决. 我们以前的解决办法是,添加到项目中直接修改源码.这样就有一个问题,不能和源库同步,当作者更新后你不能(po ...