java反射|Reflection详解
来源:互联网 发布:巴特尔cba数据 编辑:程序博客网 时间:2024/05/01 18:18
反射是JDK5.0提供的java新特性,反射的出现打破了java一些常规的规则,如,私有变量不可访问。
简单的来说,反射机制指的是程序在运行时能够获取自身的信息。在java中,只要给定类的名字, 那么就可以通过反射机制来获得类的所有信息。
一般而言,开发者社群说到动态语言,大致认同的一个定义是:“程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言”尽管在这样的定义与分类下Java不是动态语言,它却有着一个非常突出的动态相关机制:Reflection。这个字的意思是“反射、映象、倒影”,用在Java身上指的是我们可以于运行时加载、探知、使用编译期间完全未知的classes。换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体、或对其fields设值、或唤起其methods。这种“看透class”的能力(the ability of the program to examine itself)被称为introspection(内省、内观、反省)。Reflection和introspection是常被并提的两个术语
API简介
在JDK中,主要由以下类来实现Java反射机制,这些类都位于java.lang.reflect包中
–Class类:代表一个类。
–Field 类:代表类的成员变量(成员变量也称为类的属性)。
–Method类:代表类的方法。
–Constructor 类:代表类的构造方法。
–Array类:提供了动态创建数组,以及访问数组的元素的静态方法
/**
* 根据属性名获取属性值
* */
private Object getFieldValueByName(String fieldName, Object o) {
try {
String firstLetter = fieldName.substring(0, 1).toUpperCase();
String getter = "get" + firstLetter +fieldName.substring(1);
Method method = o.getClass().getMethod(getter, new Class[] {});
Object value = method.invoke(o, new Object[] {});
return value;
} catch (Exception e) {
log.error(e.getMessage(),e);
return null;
}
}
/**
* 获取属性名数组
* */
private String[] getFiledName(Object o){
Field[]fields=o.getClass().getDeclaredFields();
String[]fieldNames=new String[fields.length];
for(int i=0;i<fields.length;i++){
System.out.println(fields[i].getType());
fieldNames[i]=fields[i].getName();
}
return fieldNames;
}
/**
* 获取属性类型(type),属性名(name),属性值(value)的map组成的list
* */
private List getFiledsInfo(Object o){
Field[]fields=o.getClass().getDeclaredFields();
String[] fieldNames=newString[fields.length];
List list = new ArrayList();
Map infoMap=null;
for(int i=0;i<fields.length;i++){
infoMap = new HashMap();
infoMap.put("type",fields[i].getType().toString());
infoMap.put("name",fields[i].getName());
infoMap.put("value",getFieldValueByName(fields[i].getName(), o));
list.add(infoMap);
}
return list;
}
/**
* 获取对象的所有属性值,返回一个对象数组
* */
public Object[] getFiledValues(Object o){
String[]fieldNames=this.getFiledName(o);
Object[] value=newObject[fieldNames.length];
for(int i=0;i<fieldNames.length;i++){
value[i]=this.getFieldValueByName(fieldNames[i],o);
}
return value;
}
- java反射|Reflection详解
- Java Reflection (JAVA反射)详解
- Java Reflection (JAVA反射)详解
- Java Reflection (JAVA反射)详解
- Java Reflection (JAVA反射)详解
- Java Reflection (JAVA反射) 详解
- Java Reflection (JAVA反射)详解
- Java反射(Reflection)详解
- 详解Java反射机制(Reflection)
- Java Reflection(反射机制)详解
- Java Reflection (JAVA反射)详解(一)
- Java Reflection (JAVA反射)详解 (二)
- 进阶:Java Reflection (JAVA反射)详解
- C#反射(Reflection)详解
- C#反射(Reflection)详解
- C#反射(Reflection)详解
- C#反射(Reflection)详解
- C#反射(Reflection)详解
- hdu--DP(必须掌握)
- 链表的逆置,归并,拆分以及其他函数集合
- Java并发编程实战--死锁
- Android原理之 View、ViewGroup
- Maya: 菜单 编辑网格 >翻转三角形边
- java反射|Reflection详解
- 用户管理的备份,恢复和还原知识点小结
- 整数各位数分离(C语言代码)
- 视频监控之VSCloud Camera 添加
- Maya: 菜单 编辑网格 >正向自旋边
- C# 线程之Thread
- 系统运维技巧(四)——root忘记密码及保护操作系统
- Linux Shell基础知识2
- Camera最新资料大全