java反射——方法
大家都知道反射技术在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反射——方法的更多相关文章
- 【译】5. Java反射——方法
原文地址:http://tutorials.jenkov.com/java-reflection/methods.html ====================================== ...
- Java反射-方法(Method)
工作了三年,第二次使用反射! 遇到的问题描述: 多个页面查询后,返回的List中的对象属性为“.00”,页面显示不友好. 查询原因是因为查询数据的SQL为:to_char(a.applyAmount, ...
- Java 反射 方法调用
在使用Java 反射时,对方法的调用,可能碰到最多的问题是,方法的变量如何使用.其实,调用方法的变量全部在参数数组里,不管有多少个参数,你都要把它放在参数数组里,如果是单个非数组参数,则可不使用参数数 ...
- java反射--方法反射的基本操作
方法的反射 1)如何获取某个方法 方法的名称和方法的参数列表才能唯一决定某个方法. 2)方法反射的操作 method.invoke(对象,参数列表). 代码实例: package com.reflec ...
- Java反射方法总结
1.得到构造器的方法 Constructor getConstructor(Class[] params) -- 获得使用特殊的参数类型的公共构造函数, Constructor[] getConstr ...
- 【译】7. Java反射——私有字段和私有方法
原文地址:http://tutorials.jenkov.com/java-reflection/private-fields-and-methods.html =================== ...
- Java 反射机制学习资料
Java反射——引言 Java反射——Class对象 Java反射——构造函数 Java反射——字段 Java反射——方法 Java反射——Getter和Setter Java反射——私有字段和私有方 ...
- Java反射——引言
Java反射——引言 原文地址:http://tutorials.jenkov.com/java-reflection/index.html *By Jakob Jenkov Java的反射机制使得它 ...
- 【译】1. Java反射——引言
原文地址:http://tutorials.jenkov.com/java-reflection/index.html *By Jakob Jenkov Java的反射机制使得它可以在运行时检查类.接 ...
随机推荐
- Wpf 抽屉效果
在android开发中有抽屉效果,就是在页面的边上有一个按钮,可以通过点击或者拖拽这个按钮,让页面显示.Wpf也可以实现相同的效果. 主要是通过一个DoubleAnimation和RectAnimat ...
- UNIX网络编程卷1 时间获取程序client UDP 协议无关
本文为senlie原创.转载请保留此地址:http://blog.csdn.net/zhengsenlie /** * UDP.协议无关,调用 getaddrinfo 和 udp_client **/ ...
- 2015·Fool's Day·NND
本博文没有主旨,仅仅是记录. ============================ Date:2015/4/1 - April Fool's Day! Addr:ZhongHai ======== ...
- Form.ShowWithoutActivation 属性
获取一个值,该值指示显示窗口时是否激活它. 命名空间: System.Windows.Forms程序集: System.Windows.Forms(在 System.Windows.Forms.d ...
- zookeeper伪分布式安装
本文介绍zookeeper伪分布式安装. 所谓 “伪分布式集群” 就是在1台PC中启动多个zookeeper的实例.“完全分布式集群” 是每1台PC启动1个ZooKeeper实例. 由于我的测试环境P ...
- EM5-PE2B
1. vocabulary once adv. 一次,曾经 They cocktailed once every week. He once lived in shanghai. twice adv ...
- 使用 Bolt 实现 GridView 表格控件
用 Bolt 实现了一个表格控件: 1. 提供 Insert,Remove,Get,Set 接口,可以为表格增删数据: 2. 通过 ItemClass, ItemSetDataFunc 属性来指定显 ...
- js arguments 内置对象
1.arguments是js的内置对象. 2.在不确定对象是可以用来重载函数. 3.用法如下: function goTo() { var i=arguments.length; alert(i); ...
- curl编译
首先下载并解压: wget http://curl.haxx.se/download/curl-7.37.1.tar.gz tar -xzvf curl-7.37.1.tar.gz 编译安装: cd ...
- 一次csrf配合xss的攻击实例
xss出现在我的邮箱处 alert of payload "><script>alert(/test/)</script><" by cooki ...