本文共 10075 字,大约阅读时间需要 33 分钟。
-
什么是反射?
反射:提供在运行时构造一个类的对象;判断一个类所具有的成员变量和方法;调用一个对象的方法;生成动态代理。
-
反射在java的常用方法
1,获取反射类
1)类的class属性
2)实例的getClass()方法
3)使用Class类中的forName()静态方法
Class clazz = obj.getClass();clazz = Object.class;try { clazz = Class.forName("java.lang.Object"); System.out.println(clazz.toString());} catch (ClassNotFoundException e) { e.printStackTrace();}
2,获取属性
1)、getFields()
方法返回所有可访问的公共字段在类中声明或继承自超类
2)、getDeclaredFields()
方法返回所有字段只出现在类的声明中(不是从继承的字段)。
3)、getField(String name)
状语从句: getDeclaredField(String name)
通过字段名电子杂志 Field
对象。
public static void test(Object obj){ Class clazz = obj.getClass(); clazz = Object.class; try { clazz = Class.forName("java.lang.Integer"); Field[] fields = clazz.getFields(); fields = clazz.getDeclaredFields(); System.out.println("拥有以下属性:"); for (int i = 0; i < fields.length; i++) { System.out.println(fields[i].getName()); } System.out.println("获取属性MIN_VALUE:"); Field field = clazz.getDeclaredField("MIN_VALUE"); System.out.println(field.toGenericString()); System.out.println(field.getInt("MIN_VALUE")); } catch (ClassNotFoundException | NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) { e.printStackTrace(); }}
3,获取构造方法
1)、
getConstructors()
方法返回当前和超类的所有公共构造函数。
2)、
getDeclaredConstructors()
方法返回当前类的所有声明的构造函数。
3)、
getConstructor(Class ... parameterTypes )和getDeclaredConstructor (Class ... parameterTypes )通过参数类型获取构造函数对象。
clazz = Class.forName("java.lang.Integer");Constructor[] cs = clazz.getConstructors();System.out.println("拥有以下构造方法:");for (int i = 0; i < cs.length; i++) { System.out.println(cs[i].getName()); System.out.println(cs[i].toGenericString());}Constructor c = clazz.getConstructor(String.class);System.out.println(c.getName());System.out.println(c.toGenericString());System.out.println(c.newInstance("32"));
4,获取方法
1)、
getMethods()
方法返回该类的所有可访问的公共方法无论从类中还是继承自超类。
2)、
getDeclaredMethods()
方法返回所有只在中声明的方法该类(不包括从超类继承的方法)。
3)、
getMethod (String name ,Class ... parameterTypes )和getDeclaredMethod (String name ,Class ... parameterTypes )通过方法名和参数类型获取方法对象
4)、的方法,类中的getReturnType()方法返回包含有关返回类型信息的类对象
Method[] methods = clazz.getMethods();System.out.println("拥有以下方法:");for (int i = 0; i < methods.length; i++) { System.out.println(methods[i].getName()); System.out.println(methods[i].toGenericString()); System.out.println(methods[i].getReturnType());}Method method = clazz.getMethod("toString");System.out.println("取得方法:");System.out.println(method.getName());System.out.println(method.toGenericString());System.out.println(method.getReturnType());Method method1 = clazz.getMethod("compare",new Class[] { int.class,int.class });System.out.println("取得方法:");System.out.println(method1.getName());System.out.println(method1.toGenericString());System.out.println(method1.getReturnType());System.out.println(method1.invoke(int.class,23, 23));System.out.println(method1.invoke(Boolean.class,20, 23));//对于 JavaBean 类可以使用PropertyDescriptor来获取属性getter、setter方法//PropertyDescriptor 类表示 JavaBean 类通过存储器导出一个属性。//PropertyDescriptor pd = new PropertyDescriptor(field.getName(), clazz);//Method getMethod = pd.getReadMethod();
5,属性设置
1)、newInstance()
方法来创建一个对象。
2)、
获取字段的引用点域类
3)、中,要读取字段的值,请在字段上调用的getXxx()方法,其中的xxx 是字段的数据类型。
4)、要设置字段的值,请调用相应的的setXXX()方法。
5)、反射访问类的非可访问字段,方法和构造函数从 AccessibleObject 类调用 setAccessible(boolean flag)方法。我们需要使用真参数调用此方法,以使该字段,方法和构造函数可访问。
6,调用方法
1)、Method类invoke()方法
7,属性注解
1)、现场类的isAnnotationPresent()
8,获取类的所有修饰符
1)、getModifiers()
9,获取超类
1)、getSuperclass之类()
10,获取实现的接口
1)、getInterfaces()
//比较相同类型对象值变更public ListcontrastObj(Object pojo1, Object pojo2) { List appDetails = new ArrayList<>(); String className = pojo1.getClass().getName(); if (pojo1.getClass().getName().equals(pojo2.getClass().getName()) ) { try { Class clazz = pojo1.getClass(); Field[] fields = pojo1.getClass().getDeclaredFields(); int i=1; for (Field field : fields) { PropertyDescriptor pd = new PropertyDescriptor(field.getName(), clazz); Method getMethod = pd.getReadMethod(); //String classType = field.getType().toString(); //int lastIndex = classType.lastIndexOf("."); //classType = classType.substring(lastIndex + 1); Object oldValue = getMethod.invoke(pojo1); Object newValue = getMethod.invoke(pojo2); //数字类型需处理(字符串) if("d_inLenth".equals(field.getName()) || "d_inWidth".equals(field.getName()) || "d_inHeight".equals(field.getName()) || "d_specificRange".equals(field.getName())){ if(oldValue==null){ oldValue=""; } if(newValue==null){ newValue=""; } } //无需比较字段 String[] pseudoFieldName = {"yearName","materialTypeName","s_years","s_collectType","materialName","numberTypeName","massRangeName","regUnit","codeTypeName", "s_sourceName","saveStatus","collTimeName","storeroomName","keeperName","s_relicGradeName","s_completelevel","collectionName","s_indentLevel","s_id"}; if (Arrays.asList(pseudoFieldName).contains(field.getName())) { continue; } if (oldValue==null&&(newValue!=null&&!"".equals(newValue))) { CollModiAppDetail appDetail = new CollModiAppDetail(); String nameString=className; int m=nameString.lastIndexOf("."); /* if(!"CollData".equals(nameString.substring(m+1))){ if("s_collectionNo".equals(field.getName())){ continue; } }*/ //类名 appDetail.setS_tableName(nameString.substring(m+1)); //属性名 appDetail.setS_fieldName(field.getName()); //新值 appDetail.setS_revisedContent(newValue.toString()); appDetails.add(appDetail); i++; } if(oldValue==null || newValue == null){ continue; } if (!oldValue.toString().equals(newValue.toString())) { CollModiAppDetail appDetail = new CollModiAppDetail(); String nameString=className; int m=nameString.lastIndexOf("."); //类名 appDetail.setS_tableName(nameString.substring(m+1)); //属性名 appDetail.setS_fieldName(field.getName()); //旧值 appDetail.setS_originalContent(oldValue.toString()); //新值 appDetail.setS_revisedContent(newValue.toString()); appDetails.add(appDetail); i++; } } } catch (Exception e) { e.printStackTrace(); } } return appDetails; }
/** * 判断对象属性是否为空 * @param attachInfo * @return */ private boolean nullobj(Object obj) { //查询出对象所有的属性 Field[] fields = obj.getClass().getDeclaredFields(); //用于判断所有属性是否为空,如果参数为空则不查询 boolean flag = false; for (Field field : fields) { //不检查 直接取值 field.setAccessible(true); try { if(!StringUtils.isEmpty(field.get(obj))) { //不为空 flag = true; //当有任何一个参数不为空的时候则跳出判断直接查询 break; } } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } } return flag; }
/** * 将已修改的值拼接到原对象 * @param data * @param dataDetail 变更明细表 * @return * @throws IllegalAccessException * @throws IllegalArgumentException * @throws InvocationTargetException */ private Object mosaicObject(Object object,ListdataDetail) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException { Field[] fields = object.getClass().getDeclaredFields(); Class clazz = object.getClass(); for (Field field : fields) { try { PropertyDescriptor pd = new PropertyDescriptor(field.getName(), clazz); Method setMethod =pd.getWriteMethod(); Method value = pd.getReadMethod(); String classType = field.getType().toString(); int lastIndex = classType.lastIndexOf("."); classType = classType.substring(lastIndex + 1); for (CollModiAppDetail dataDetails : dataDetail) { if((dataDetails.getS_fieldName()).equals(field.getName())){ String s = dataDetails.getS_revisedContent(); if("Double".equals(classType) ){ if (s!=null ) { if (!"".equals(s)) { setMethod.invoke(object,Double.valueOf(s)); } }else{ if (value.invoke(object)!=null) { setMethod.invoke(object,Double.valueOf("0")); } } }else if ("Timestamp".equals(classType)) { if (s!=null) { if (!"".equals(s)) { s= s.substring(0,s.indexOf(".")); setMethod.invoke(object, DateUtil.string2Timestamp(s)); } } }else if("Integer".equals(classType)){ if (s!=null) { if(!"".equals(s)){ setMethod.invoke(object,Integer.valueOf(s)); } }else{ if (value.invoke(object)!=null) { setMethod.invoke(object,Integer.valueOf("0")); } } }else{ if (s!=null) { setMethod.invoke(object, s); }else{ if (value.invoke(object)!=null) { setMethod.invoke(object,""); } } } } } } catch (IntrospectionException e) { e.printStackTrace(); } } return object; }
转载地址:https://blog.csdn.net/qq_29593573/article/details/84767294 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!