java反射使用简析
发布日期:2022-02-14 16:09:32 浏览次数:36 分类:技术文章

本文共 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 List
contrastObj(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,List
dataDetail) 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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:【RabbitMQ-6】消费端获取消息(SpringBoot2.0版本)
下一篇:jquery使用笔记

发表评论

最新留言

逛到本站,mark一下
[***.202.152.39]2024年04月18日 16时34分42秒