Java Reflection 反射基础
反射基础:
package reflection; /**
* Created by : Infaraway
* DATE : 2017/3/2
* Time : 23:06
* Funtion : Person为父类
*/
public class Person {
public String name;
public Integer age;
private String address;
private String phoneNumber;
private String email; public Person() { } public Person(String name, Integer age) {
this.name = name;
this.age = age;
} private void personMethod(){
System.out.println("this is personMethod...");
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public void setName(String name, Integer age){
this.name = name;
} public Integer getAge() {
return age;
} public void setAge(Integer age) {
this.age = age;
} public String getAddress() {
return address;
} public void setAddress(String address) {
this.address = address;
} public String getPhoneNumber() {
return phoneNumber;
} public void setPhoneNumber(String phoneNumber) {
this.phoneNumber = phoneNumber;
} public String getEmail() {
return email;
} public void setEmail(String email) {
this.email = email;
}
}
package reflection; /**
* Created by : Infaraway
* DATE : 2017/3/3
* Time : 12:17
* Funtion : Student子类
*/
public class Student extends Person { public String classes; private String school;
private String grade; public Student() {
} public Student(String name, Integer age) {
super(name, age);
} private void studentMethod(String school){
System.out.println("this is studentMethod...");
}
}
最基本的反射使用为一下的代码表示:主要获取 字段 和 方法为主;
package reflection; import org.junit.Test; import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method; /**
* Created by : Infaraway
* DATE : 2017/3/2
* Time : 23:10
* Funtion : 反射及基本用法
*/
public class testReflect { String className = "reflection.Student"; /**
* 测试反射的基本用法
* @throws Exception
*/
@Test
public void testPerson() throws Exception {
Class clazz = Class.forName("reflection.Person"); // 1. Class类中的getFields,getMethods,getConstructors方法
// 分别返回提供的 public 域 方法 和构造器
// 并且包括超类的公有成员
Field[] fields = clazz.getFields();
for (Field field : fields) {
System.out.println(field.getName());
} Method [] methods = clazz.getMethods();
for (Method method: methods) {
System.out.println(method.getName());
} Constructor [] constructors = clazz.getConstructors();
for (Constructor constructor : constructors) {
System.out.println(constructor.getName());
} // 2. Class类中的getDeclaredFields,getDeclaredMethods,getDeclaredConstructors方法
// 获取所有的方法包括 private方法,且只获取当前类声明的方法
// 不包括超类的成员
Field[] fieldsDeclared = clazz.getDeclaredFields();
for (Field field : fieldsDeclared) {
System.out.println(field.getName());
} Method [] methodsDeclared = clazz.getDeclaredMethods();
for (Method method: methodsDeclared) {
System.out.println("method2---"+method.getName());
} Constructor [] constructorsDeclared = clazz.getDeclaredConstructors();
for (Constructor constructor : constructorsDeclared) {
System.out.println(constructor.getName());
} // 3.获取指定的方法 getDeclaredMethod可以获取私有的方法
// 获取特定方法时,需要两个东西确定调用的方法:1)方法名,2)方法的参数(重载)
Method methodSp = clazz.getDeclaredMethod("setName",String.class);
System.out.println(methodSp); //当需要使用反射式,参数类型必须是包装类 int --> Integer 等等
Method methodSp2 = clazz.getDeclaredMethod("setName",String.class, Integer.class);
System.out.println(methodSp2); //4. 执行方法
Object object = clazz.newInstance();
methodSp.invoke(object, "zhong"); }
}
也可以通过反射获取并且调用父类的方法(包括public 和private)
以下只提供实现上述方法的工具类:
package reflection; import java.lang.reflect.Method; /**
* Created by : Infaraway
* DATE : 2017/3/3
* Time : 12:18
* Funtion :
*/
public class ReflectUtils { /**
* 返回方法
* @param clazz 类
* @param methodName 方法名称
* @param args 参数列表
* @return 返回方法(由于使用了setAccessible方法,改使private的 method也可执行)
*/
public static Method getMethod(Class clazz, String methodName, Object...args) {
Method method = null;
Class [] parametersTypes = new Class[args.length];
//得到所有参数的class
for (int i = 0; i < args.length; i++) {
parametersTypes[i] = args[i].getClass();
}
for (;clazz != Object.class; clazz = clazz.getSuperclass()){
try {
method = clazz.getDeclaredMethod(methodName,parametersTypes);
method.setAccessible(true);
return method;
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
}
return null;
} /**
* 获取clazz中的methodName方法,该方法可能是私有方法,也可能是父类中的私有方法
* @param clazz 类
* @param methodName 方法名称
* @param parametersTypes 参数类型数组
* @return 方法的对象
*/
public static Method getSuperMehtod(Class clazz, String methodName, Class...parametersTypes){
Method method = null;
for (;clazz != Object.class; clazz = clazz.getSuperclass()){
try {
method = clazz.getDeclaredMethod(methodName, parametersTypes);
return method;
}catch (Exception e){
//method不在当前类定义,继续向上转型
}
}
return null;
} /**
* 反射执行调用方法,可以使public 或者 private 可以使当前类或者 父类
* @param obj 类对象
* @param methodName 方法名
* @param args 参数列表
* @return 方法的返回值
*/
public static Object invokeMethod(Object obj, String methodName, Object...args){
Class [] parametersTypes = new Class[args.length];
//得到所有参数的class
for (int i = 0; i < args.length; i++) {
parametersTypes[i] = args[i].getClass();
} try {
Method method = getSuperMehtod(obj.getClass(), methodName, parametersTypes);
//设置私有方法可调用
method.setAccessible(true);
//执行method方法 并返回方法的返回值
return method.invoke(obj, args);
}catch (Exception e ){
e.printStackTrace();
}
return null;
}
}
本文所需完整版代码:https://git.oschina.net/infaraway/basisJava/tree/master/src/reflection
Java Reflection 反射基础的更多相关文章
- Java的反射基础技术
今天本人给大家讲解一下Java的反射基础技术,如有不对的或者讲的不好的可以多多提出,我会进行相应的更改,先提前感谢提出意见的各位了!!! 什么是反射? 反射它是根据字节码文件可以反射出类的信息.字段. ...
- java Reflection(反射)基础知识讲解
原文链接:小ben马的java Reflection(反射)基础知识讲解 1.获取Class对象的方式 1.1)使用 "Class#forName" public static C ...
- Java进阶之reflection(反射机制)——反射概念与基础
反射机制是Java动态性之一,而说到动态性首先得了解动态语言.那么何为动态语言? 一.动态语言 动态语言,是指程序在运行时可以改变其结构:新的函数可以引进,已有的函数可以被删除等结构上的变化.比如常见 ...
- java反射基础知识(四)反射应用实践
反射基础 p.s: 本文需要读者对反射机制的API有一定程度的了解,如果之前没有接触过的话,建议先看一下官方文档的Quick Start. 在应用反射机制之前,首先我们先来看一下如何获取一个对象对应的 ...
- java反射 之 反射基础
一.反射 反射:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为 ...
- 【转】Java反射 之 反射基础
一.反射 反射:Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为 ...
- Java开发培训基础知识解析之反射机制
Java是老牌编程语言,是当前应用最广泛的编程语言之一.想要学习Java你就一定要掌握Java基础知识,而反射对于初学Java的人来说绝对是非常重要的知识点.什么是反射?如何理解反射机制?如何使用反射 ...
- java反射基础知识(一)
一.反射 反射:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为 ...
- Java基础教程:反射基础
Java基础教程:反射基础 引入反射 反射是什么 能够动态分析类能力的程序称为反射. 反射是一种很强大且复杂的机制. Class类 在程序运行期间,Java运行时系统始终为所有对象维护一个被称为运行时 ...
随机推荐
- Django学习日记07_Admin
django.contrib django.contrib是django中附带的一个工具集,由很多的附加组件组成.这些附加组件包括管理工具(django.contrib.admin).用户鉴别系统(d ...
- 转载:DNS解析过程详解
2015-09-20 此好文是转载,如有侵权联系我,立马删掉 DNS的几个基本概念: 一. 根域 就是所谓的“.”,其实我们的网址www.baidu.com在配置当中应该是www.baidu.com. ...
- Spring Boot实战:Restful API的构建
上一篇文章讲解了通过Spring boot与JdbcTemplate.JPA和MyBatis的集成,实现对数据库的访问.今天主要给大家分享一下如何通过Spring boot向前端返回数据. 在现在的开 ...
- angular4.0命令行汇总
查看ng命令行 ng help 创建项目 ng new projectName ng new projectName --routing[--routing表示创建带路由的项目] 配置依赖 npm i ...
- Python(一)字符串用法
一.程序输出 :print 在Python2.X中,print 的用法是 : print "hello word! " 在Python3.X中,print作为函数的方式出现,用法: ...
- python 常用算法
算法就是为了解决某一个问题而采取的具体有效的操作步骤 算法的复杂度,表示代码的运行效率,用一个大写的O加括号来表示,比如O(1),O(n) 认为算法的复杂度是渐进的,即对于一个大小为n的输入,如果他的 ...
- 自学Aruba1.1-Aruba体系结构-产品线
点击返回:自学Aruba之路Aruba产品线 IP switches: 1500.2500.3500 Controllers:7200 .70x0 Series.7005 Meridian:基于ACE ...
- Markdown 常用语法
1.标题 # 一级标题 ## 二级标题 ### 三级标题 2.字体 *斜体* **粗体** ~~删除线~~<u>下划线</u> 3.引用 > 引用文字 4.无序列表 - ...
- 如何在一个项目中同时包含mvc建站、webapi接口
项目做得多了..就会发现有些小项目不想建太多的项目..现在思明在这里和大家分享一下如果再一个项目中同时包含mvc建站以及实现webapi接口 1.新建项目 aps.net web 应用程序 2 新建模 ...
- MYSQL:插入记录检查记录是否存在,存在则更新,不存在测插入记录SQL
我们在开发数据库相关的逻辑过程中, 经常检查表中是否已经存在这样的一条记录, 如果存在则更新或者不做操作, 如果没有存在记录,则需要插入一条新的记录. 这样的逻辑固然可以通过两条sql语句完成. SE ...