java反射相关
2017-02-08 15:33
316 查看
getFields()获得某个类的所有的公共(public)的字段,包括父类。
public class Person2 {
private int id;
private int age;
private String personName;
private Timestamp birthdate;
public String identitify;
protected String address;
String phone;
}
@Test
public void test_getDeclaredFields() {
Field[]fields=Person2.class.getFields();
for (int i = 0; i < fields.length; i++) {
Field field = fields[i];
System.out.println(field.getName());
}
}
运行结果如下:
identitify
getDeclaredFields()获得某个类的所有申明的字段,即包括public、private和proteced,但是不包括父类的申明字段。
@Test
public void test_getDeclaredFields() {
Field[]fields=Person2.class.getDeclaredFields();
for (int i = 0; i < fields.length; i++) {
Field field = fields[i];
System.out.println(field.getName());
}
}
运行结果:
id
age
personName
birthdate
identitify
address
phone
/**
* 反射集合类
* */
public class ReflectUtils {
/**
* 获取类clazz的所有Field,包括其父类的Field,如果重名,以子类Field为准。
* @param clazz
* @return Field数组
*/
public static Field[] getAllField(Class<?>
clazz) {
ArrayList<Field> fieldList =
new ArrayList<Field>();
Field[] dFields =
clazz.getDeclaredFields();
if (null !=
dFields && dFields.length > 0) {
fieldList.addAll(Arrays.asList(dFields));
}
Class<?> superClass =
clazz.getSuperclass();
if (superClass != Object.class) {
Field[] superFields = getAllField(superClass);
if (null !=
superFields && superFields.length > 0) {
for(Field
field:superFields){
if(!isContain(fieldList,
field)){
fieldList.add(field);
}
}
}
}
Field[] result=new Field[fieldList.size()];
fieldList.toArray(result);
return
result;
}
/**
* 检测Field List中是否已经包含了目标field
*
* @param fieldList
* @param field 带检测field
* @return
*/
public static
boolean isContain(ArrayList<Field> fieldList,Field
field){
for(Field
temp:fieldList){
if(temp.getName().equals(field.getName())){
return
true;
}
}
return
false;
}
}
Class superclass = clazz.getSuperclass(); //得到父类的完权限定名
String simpleName = clazz.getSuperclass().getSimpleName(); //得到不含包名的父类名
private List<Object> buildHql(Object
obj) {
Class<?> clazz =
obj.getClass();
StringBuilder hql =
new StringBuilder("SELECT t FROM ");
hql.append(clazz.getSimpleName());
hql.append(" t ");
Field[] fs = ReflectUtils.getAllField(clazz);
Field idField =
null;
List<Object> conditionVals =
new ArrayList<Object>();
List<String> wheres =
new ArrayList<String>();
for (Field
f : fs) {
f.setAccessible(true);
try {
Object
val = f.get(obj);
if (!Modifier.isStatic(f.getModifiers()) &&
val != null) {
if (f.getType() == String.class) {
wheres.add(MessageFormat.format(" t.{0} like %?%",
f.getName()));
}
else {
wheres.add(MessageFormat.format(" t.{0} =?",
f.getName()));
}
conditionVals.add(val);
}
Id
id = f.getAnnotation(Id.class);
if (id !=
null) {
idField =
f;
}
} catch (Exception
e) {
}
}
if (!wheres.isEmpty()) {
hql.append(" WHERE ");
hql.append(StringUtils.join(wheres,
" AND "));
}
if (idField !=
null) {
hql.append(MessageFormat.format(" ORDER BY t.{0} desc",
idField.getName()));
}
List<Object> ret =
new ArrayList<Object>();
ret.add(hql.toString());
ret.add(conditionVals);
return
ret;
}
Java 反射机制中,Field的getModifiers()方法返回int类型值表示该字段的修饰符。其中,该修饰符是java.lang.reflect.Modifier的静态属性。对应表如下:PUBLIC: 1
PRIVATE: 2
PROTECTED: 4
STATIC: 8
FINAL: 16
SYNCHRONIZED: 32
VOLATILE: 64
TRANSIENT: 128
NATIVE: 256
INTERFACE: 512
ABSTRACT: 1024
STRICT: 2048如果存在该元素的指定类型的注解,则返回这些注解,否则返回 null。Id id = f.getAnnotation(Id.class);if (id != null) { idField = f;}f.isAnnotationPresent(Id.class)
public class Person2 {
private int id;
private int age;
private String personName;
private Timestamp birthdate;
public String identitify;
protected String address;
String phone;
}
@Test
public void test_getDeclaredFields() {
Field[]fields=Person2.class.getFields();
for (int i = 0; i < fields.length; i++) {
Field field = fields[i];
System.out.println(field.getName());
}
}
运行结果如下:
identitify
getDeclaredFields()获得某个类的所有申明的字段,即包括public、private和proteced,但是不包括父类的申明字段。
@Test
public void test_getDeclaredFields() {
Field[]fields=Person2.class.getDeclaredFields();
for (int i = 0; i < fields.length; i++) {
Field field = fields[i];
System.out.println(field.getName());
}
}
运行结果:
id
age
personName
birthdate
identitify
address
phone
/**
* 反射集合类
* */
public class ReflectUtils {
/**
* 获取类clazz的所有Field,包括其父类的Field,如果重名,以子类Field为准。
* @param clazz
* @return Field数组
*/
public static Field[] getAllField(Class<?>
clazz) {
ArrayList<Field> fieldList =
new ArrayList<Field>();
Field[] dFields =
clazz.getDeclaredFields();
if (null !=
dFields && dFields.length > 0) {
fieldList.addAll(Arrays.asList(dFields));
}
Class<?> superClass =
clazz.getSuperclass();
if (superClass != Object.class) {
Field[] superFields = getAllField(superClass);
if (null !=
superFields && superFields.length > 0) {
for(Field
field:superFields){
if(!isContain(fieldList,
field)){
fieldList.add(field);
}
}
}
}
Field[] result=new Field[fieldList.size()];
fieldList.toArray(result);
return
result;
}
/**
* 检测Field List中是否已经包含了目标field
*
* @param fieldList
* @param field 带检测field
* @return
*/
public static
boolean isContain(ArrayList<Field> fieldList,Field
field){
for(Field
temp:fieldList){
if(temp.getName().equals(field.getName())){
return
true;
}
}
return
false;
}
}
Class superclass = clazz.getSuperclass(); //得到父类的完权限定名
String simpleName = clazz.getSuperclass().getSimpleName(); //得到不含包名的父类名
private List<Object> buildHql(Object
obj) {
Class<?> clazz =
obj.getClass();
StringBuilder hql =
new StringBuilder("SELECT t FROM ");
hql.append(clazz.getSimpleName());
hql.append(" t ");
Field[] fs = ReflectUtils.getAllField(clazz);
Field idField =
null;
List<Object> conditionVals =
new ArrayList<Object>();
List<String> wheres =
new ArrayList<String>();
for (Field
f : fs) {
f.setAccessible(true);
try {
Object
val = f.get(obj);
if (!Modifier.isStatic(f.getModifiers()) &&
val != null) {
if (f.getType() == String.class) {
wheres.add(MessageFormat.format(" t.{0} like %?%",
f.getName()));
}
else {
wheres.add(MessageFormat.format(" t.{0} =?",
f.getName()));
}
conditionVals.add(val);
}
Id
id = f.getAnnotation(Id.class);
if (id !=
null) {
idField =
f;
}
} catch (Exception
e) {
}
}
if (!wheres.isEmpty()) {
hql.append(" WHERE ");
hql.append(StringUtils.join(wheres,
" AND "));
}
if (idField !=
null) {
hql.append(MessageFormat.format(" ORDER BY t.{0} desc",
idField.getName()));
}
List<Object> ret =
new ArrayList<Object>();
ret.add(hql.toString());
ret.add(conditionVals);
return
ret;
}
for (Field f : clazz.getDeclaredFields()) { f.setAccessible(true);//AccessibleTest类中的成员变量为private,故必须进行此操作 System.out.println(f.get(at));//获取当前对象中当前Field的value }
Java 反射机制中,Field的getModifiers()方法返回int类型值表示该字段的修饰符。其中,该修饰符是java.lang.reflect.Modifier的静态属性。对应表如下:PUBLIC: 1
PRIVATE: 2
PROTECTED: 4
STATIC: 8
FINAL: 16
SYNCHRONIZED: 32
VOLATILE: 64
TRANSIENT: 128
NATIVE: 256
INTERFACE: 512
ABSTRACT: 1024
STRICT: 2048如果存在该元素的指定类型的注解,则返回这些注解,否则返回 null。Id id = f.getAnnotation(Id.class);if (id != null) { idField = f;}f.isAnnotationPresent(Id.class)
相关文章推荐
- Java反射访问私有变量和私有方法相关搜集
- 《Spring 3.x 企业应用开发实战》学习笔记 第三章 IoC容器概述 3.2 相关Java基础知识 类装载器 反射机制
- 夯实JAVA基本之二 —— 反射(2):泛型相关周边信息获取
- java 反射method 相关
- Java用反射机制在不看类的实现方法下查看类的相关信息
- Java学习,数组的相关操作,封装类,Class类,反射API
- java反射相关
- Java 反射(2):泛型相关周边信息获取
- 夯实JAVA基本之二 —— 反射(2):泛型相关周边信息获取
- java 反射相关的知识点
- 黑马程序员--Java基础加强--12.利用反射操作泛型I【与反射+泛型相关的接口类型综述】【Type】【ParameterizedType】【个人总结】
- java 的反射机制相关方法的使用
- java学习笔记 反射reflection相关知识点小结
- 总结java反射相关知识
- Java反射相关类结构 package: java.lang.reflect
- 《Spring 3.x 企业应用开发实战》学习笔记 第三章 IoC容器概述 3.2 相关Java基础知识 类装载器 反射机制
- java 反射相关
- Java反射框架Type Class 及相关方法浅析
- Java反射相关(一)
- 【java反射】Class类型的相关操作演练