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的反射机制使得它可以在运行时检查类.接 ...
随机推荐
- 【POJ 3140】 Contestants Division(树型dp)
id=3140">[POJ 3140] Contestants Division(树型dp) Time Limit: 2000MS Memory Limit: 65536K Tot ...
- Kafka 快速起步
Kafka 快速起步 原创 2017-01-05 杜亦舒 性能与架构 性能与架构 性能与架构 微信号 yogoup 功能介绍 网站性能提升与架构设计 主要内容:1. kafka 安装.启动2. 消息的 ...
- 点滴积累【JS】---JS小功能(JS实现多功能缓冲运动框架)
效果: 思路: 首先,多功能框架实现的功能是:css中所有的属性都可以添加进去(也可以把方法作为参数传递过去!),然后进行缓冲运动,比如:物体的高度.长度.颜色.字体大小.透明度等,都可以直接传入参数 ...
- atitit.html5动画特效----打水漂 ducks_and_drakes
atitit.html5动画特效----打水漂 ducks_and_drakes 1. 原理 1 2. fly jquery插件 1 3. ---------code 2 4. 参考 4 1. 原理 ...
- Docker使用Dockerfile创建支持ssh服务自启动的容器镜像
原文链接:Docker使用Dockerfile创建支持ssh服务自启动的容器镜像 1. 首先创建一个Dockerfile文件.文件内容例如以下 # 选择一个已有的os镜像作为基础 FROM cento ...
- Tomcat启动时报 java.lang.OutOfMemoryError: Java heap space
见效的解决方法如下: 在myeclipse中修改jvm启动的参数 打开Myeclipse -->windows-->preference-->myeclipse->serv ...
- 使用 OpCache 提升 PHP 性能
使用 OpCache 提升 PHP 性能 wdd2007wdd2007 .6k 1月29日 发布 推荐 推荐 收藏 收藏,.3k 浏览 OpCache 通过对 opcode 的缓存和优化来提升 PHP ...
- CSU 1335: 高桥和低桥 (二分查找,树状数组)
Description 有个脑筋急转弯是这样的:有距离很近的一高一低两座桥,两次洪水之后高桥被淹了两次,低桥却只被淹了一次,为什么?答案是:因为低桥太低了,第一次洪水退去之后水位依然在低桥之上,所以不 ...
- nyoj 740 “炫舞家“ST
“炫舞家“ST 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 ST是一个酷爱炫舞的玩家.TA很喜欢玩QQ炫舞,因此TA也爱屋及乌的喜欢玩跳舞机(Dance Dance ...
- Jquery学习笔记(9)--注册验证复习(未用到ajax)
纯复习,在$(this).val()这里浪费了时间,val()只适合input里面的value值,如果是span等标签里包裹的文本要用text()!! <!DOCTYPE html> &l ...