您的位置:首页 > 编程语言 > Java开发

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;
}

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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: