精华内容
下载资源
问答
  • 举个例子, 如上图中所示, 两种返回类型一种是List<T>, 一种是对象<T>时, 在写通用代码的时候应该怎么去处理 如果是List private Object doSelect(SlsSelect select, SlsTable table, Method ...

    举个例子, 如上图中所示, 两种返回类型一种是List<T>, 一种是对象<T>时, 在写通用代码的时候应该怎么去处理

    如果是List

    
        private Object doSelect(SlsSelect select, SlsTable table, Method method, Object[] args) throws ClassNotFoundException, IllegalAccessException, LogException, InstantiationException {
            String hql = select.value();
            String project = table.project();
            String logStore = table.logStore();
            if(StringUtils.isBlank(hql) || StringUtils.isBlank(project) || StringUtils.isBlank(logStore)) {
                return null;
            }
            ConcurrentHashMap<String, Object> actualParamsMap = getActualParamsMap(method, args);
            String newSQL = questionMark(hql, actualParamsMap);
            System.out.println("newSQL=" + newSQL);
    
            Class<?> returnType = method.getReturnType();
            boolean asList = Collection.class.isAssignableFrom(returnType);
            if(asList) {
                return doList(method, actualParamsMap, project, logStore, newSQL);
            } else {
                return doOne(method, actualParamsMap, project, logStore, newSQL, returnType);
            }
        }
    
        private Object doList(Method method, ConcurrentHashMap<String, Object> actualParamsMap, String project, String logStore, String newSQL) throws ClassNotFoundException, LogException, IllegalAccessException, InstantiationException {
            System.out.println("");
            List<Object> list = Collections.synchronizedList(new ArrayList<>());
            ParameterizedType parameterizedType = (ParameterizedType) method.getAnnotatedReturnType();
            Type type = parameterizedType.getActualTypeArguments()[0];
            Class<?> clazz = Class.forName(type.getTypeName());
            Client client = SpringContextUtil.getBean("slsClient");
            List<Map<String, String>> contents = selectList(client, project, logStore, newSQL, (Integer) actualParamsMap.getOrDefault("from", 0), (Integer)actualParamsMap.getOrDefault("to", 0));
            for(Map<String, String> content : contents) {
                Object record = clazz.newInstance();
                Field[] fields = record.getClass().getDeclaredFields();
                for(Field field : fields) {
                    String fieldName = field.getName();
                    Object fieldValue = content.get(fieldName);
                    field.setAccessible(true);
                    field.set(record, fieldValue);
                }
                list.add(record);
            }
            return list;
        }

     

    如果是单个对象

        private Object doOne(Method method, ConcurrentHashMap<String, Object> actualParamsMap, String project, String logStore, String newSQL, Class<?> returnType) throws LogException, IllegalAccessException, InstantiationException {
            Field[] declaredFields = returnType.getDeclaredFields();
            Client client = SpringContextUtil.getBean("slsClient");
            List<Map<String, String>> contents = selectList(client, project, logStore, newSQL, (Integer) actualParamsMap.getOrDefault("from", 0), (Integer)actualParamsMap.getOrDefault("to", 0));
            if(contents.size() == 0) {
                return null;
            }
            Map<String, String> content = contents.get(0);
            Object record = returnType.newInstance();
            for(Field field : declaredFields) {
                String fieldName = field.getName();
                Object fieldValue = content.get(fieldName);
                field.setAccessible(true);
                field.set(record, fieldValue);
            }
            return record;
        }

     这是我参考Mybatis的框架写的基于阿里云Sls日志服务写的查询框架, 完整源码太多了没有办法贴, 有需要的化可以评论区留下邮箱.

     

    展开全文
  • 反射获取List中的

    2020-12-07 16:57:22
    获取List以及List中类的属性的参考代码: public static List getListFieldValueByObject (Object object , String targetFieldName) throws Exception { List<Object> returnList = new ArrayList<>...

    参考:添加链接描述

    获取List以及List中类的属性值的参考代码:

    public static List getListFieldValueByObject (Object object , String targetFieldName) throws Exception {
    
        List<Object> returnList = new ArrayList<>();
        // 获取该对象的Class
        Class objClass = object.getClass();
        // 获取所有的属性数组
        Field[] fields = objClass.getDeclaredFields();
        for (Field field:fields) {
    
            // 判断属性是否是List类型
            if(field.getGenericType() instanceof List){
                // 对应的属性值,假设泛型List<YouObject>
                /**
                 * 举例:
                 * @JsonProperty("xi_you_ji")
                 * private List<XiYouJi> xiYouJi;
                 */
                List<YouObject> fieldValue = (List) field.get(object);
                // 获取List泛型中的对象的Class
                Class youObjectClass = YouObject.getClass(); // 此处同样可以反射获取List对应的对象无需限定死
                Field[] youObjectFields = youObjectClass.getDeclaredFields();
                // 遍历List对象属性
                for (YouObject youObject :fieldValue) {
                    // 从对象中获取目标属性值
                    for (Field youObjectField : youObjectFields) {
                        // 属性名称
                        String currentFieldName = "";
                        // 获取属性上面的注解 import com.fasterxml.jackson.annotation.JsonProperty;
                        /**
                         *  举例:
                         *   @JsonProperty("di_ren_jie")
                         *   private String diRenJie;
                         */
                        boolean has_JsonProperty =  field.isAnnotationPresent(JsonProperty.class);
                        if(has_JsonProperty){
                            currentFieldName = field.getAnnotation(JsonProperty.class).value();
                        }else {
                            currentFieldName = field.getName();
                        }
                        if(currentFieldName.equals(targetFieldName)){
                            returnList.add(field.get(object));
                        }
                    }
                }
            }
        }
        return returnList;
    }
    

    获取所有属性值的代码:

    		Student st = new Student(1,"zhuangsan",78,98);
    		Field[] fields = st.getClass().getDeclaredFields();
    		for(int i = 0 ; i < fields.length ; i++) {
    		    //设置是否允许访问,不是修改原来的访问权限修饰词。
    			fields[i].setAccessible(true);
    			System.out.println(fields[i].getName()+":"+fields[i].get(st));
    		}
    

    实例:

    	Field[] fields = valueObject.getClass().getDeclaredFields();
    	for (Field field : fields) {
        	if ("LIST_NAME".equalsIgnoreCase(field.getName())) {
            	field.setAccessible(true);
                List<YourObject> fieldValue = (List) field.get(valueObject);
                // fieldValue即为获取到的List     
    			Assert.assertEquals(fieldValue.size(), 2);
    			Assert.assertTrue(fieldValue.get(0).getSourceName().equalsIgnoreCase("DB"));
    		}
        }
    
    展开全文
  • java通过反射获取list泛型的类型

    千次阅读 2020-12-27 20:11:33
    Field[] fields = bean.getClass().getDeclaredFields(); for(Field f : fields){ ... // 如果是List类型得到其Generic的类型 Type genericType = f.getGenericType(); if(genericType == null) continue;

    通过属性来获取泛型的类型

    Field[] fields = bean.getClass().getDeclaredFields();
    		
    for(Field f : fields){
    	f.setAccessible(true);
    	if(f.getType() == java.util.List.class){
    		// 如果是List类型,得到其Generic的类型  
    		Type genericType = f.getGenericType(); 
    		if(genericType == null) continue;  
    		// 如果是泛型参数的类型   
    		if(genericType instanceof ParameterizedType){   
    			ParameterizedType pt = (ParameterizedType) genericType;
    			//得到泛型里的class类型对象  
    			Class<?> genericClazz = (Class<?>)pt.getActualTypeArguments()[0]; 
    		}   
    	}
    

    通过class对象来获取泛型类型

    Type type = getClass().getGenericSuperclass();
    		System.err.println("generic super class type:" + type);
     
    		Type trueType = ((ParameterizedType) type).getActualTypeArguments()[0];
    		//trueType就是泛型的真实类型
    

    一、getSuperclass 返回直接继承的父类(由于编译擦除,没有显示泛型参数)

    二、getGenericSuperclass 返回直接继承的父类(包含泛型参数)
    返回表示此 Class 所表示的实体(类、接口、基本类型或 void)的直接超类的 Type。

    如果超类是参数化类型,则返回的 Type 对象必须准确反映源代码中所使用的实际类型参数。如果以前未曾创建表示超类的参数化类型,则创建这个类型。有关参数化类型创建过程的语义,请参阅 ParameterizedType 声明。

    如果此 Class 表示 Object 类、接口、基本类型或 void,则返回 null。

    如果此对象表示一个数组类,则返回表示 Object 类的 Class 对象。

    列如

    package cn.test;
    
    public class Test {
    
        public static void main(String[] args) {
            System.out.println("Student.class.getSuperclass()\t"                             + Student.class.getSuperclass());
            System.out.println("Student.class.getGenericSuperclass()\t"                            + Student.class.getGenericSuperclass());
            
            System.out.println("Test.class.getSuperclass()\t"                             + Test.class.getSuperclass());
            System.out.println("Test.class.getGenericSuperclass()\t"                            + Test.class.getGenericSuperclass());
           
            System.out.println("Object.class.getGenericSuperclass()\t"                             + Object.class.getGenericSuperclass());
            System.out.println("Object.class.getSuperclass()\t"                             + Object.class.getSuperclass());
            
            System.out.println("void.class.getSuperclass()\t"                             + void.class.getSuperclass());
            System.out.println("void.class.getGenericSuperclass()\t"                             + void.class.getGenericSuperclass());
            
            System.out.println("int[].class.getSuperclass()\t"                             + int[].class.getSuperclass());
            System.out.println("int[].class.getGenericSuperclass()\t"                             + int[].class.getGenericSuperclass());
        }
    
    }
    
    class Person<T> {
    
    }
    
    class Student extends Person<Test> {
    
    }
    

    输出结果:

    Student.class.getSuperclass() class cn.test.Person
    Student.class.getGenericSuperclass() cn.test.Person<cn.test.Test>
    Test.class.getSuperclass() class java.lang.Object
    Test.class.getGenericSuperclass() class java.lang.Object
    Object.class.getGenericSuperclass() null
    Object.class.getSuperclass() null
    void.class.getSuperclass() null
    void.class.getGenericSuperclass() null
    int[].class.getSuperclass() class java.lang.Object
    int[].class.getGenericSuperclass() class java.lang.Object

    展开全文
  • * 获取某一个字段上面的泛型参数数组,典型的就是获取List对象里面是啥参数 *  * @param f * @return */ public static Class[] getParameterizedType(Field f) { // 获取f字段的通用类型 Type fc = f....

      /**

    * 获取某一个字段上面的泛型参数数组,典型的就是获取List对象里面是啥参数

    * @param f
    * @return
    */
    public static Class<?>[] getParameterizedType(Field f) {


    // 获取f字段的通用类型
    Type fc = f.getGenericType(); // 关键的地方得到其Generic的类型


    // 如果不为空并且是泛型参数的类型
    if (fc != null && fc instanceof ParameterizedType) {
    ParameterizedType pt = (ParameterizedType) fc;


    Type[] types = pt.getActualTypeArguments();


    if (types != null && types.length > 0) {
    Class<?>[] classes = new Class<?>[types.length];
    for (int i = 0; i < classes.length; i++) {
    classes[i] = (Class<?>) types[i];
    }
    return classes;
    }
    }
    return null;
    }

    展开全文
  • 获取方法的某个参数的属性的(返回值类型不确定,需要的参数在对象中位置不确定) #2)举例         需求:记录操作日志,保存用户删除订单、购买物品等操作  &...
  • 在自定义mybatis框架的过程中,在使用注解来进行配置sql语句时,就遇到了一些关于获取返回值类型的小问题。比如说方法 publIc User getOne(int id);的返回值类型是User;public List< User > getAll();的...
  • 笔者最近在学习mybatis的框架,在写源码的时候遇到了一些关于通过反射获取返回值类型的实际参数类型的问题,并且已经写有一篇关于简单的返回值类型的获取,诸如public User getOne(int id);获取返回值的类型是User,...
  • Java反射获取实际泛型类型参数

    千次阅读 2016-03-14 10:53:49
    我们知道,一个Java的类主要包括两个元素,即是成员变量和成员方法。...这些元素就是前面说的成员变量和成员方法,并且对于成员变量,反射可以对其进行设和取值,对于成员方法,反射可以直接对其进行方法调用,...
  • 反射(Reflection)是.NET中的重要机制,通过放射,可以在运行时获得.NET中每一个类型(包括类、结构、委托、接口和枚举等)的成员,包括方法、属性、事件,以及构造函数等。还可以获得每个成员的名称、限定符和参数...
  • 反射获取对象属性含list

    千次阅读 2019-08-22 22:06:05
    在xml转到service中的pojo类的时候一般会使用到反射,在转换list属性的时候,不能直接使用类似targetField=sourceField的方式,会改变目标类中引用的地址,导致service中无法引用到pojo类。所以要获取list中的对象.....
  • 上传MultipartFile类型jar包,反射解析jar包 获取方法详情,实体类属性或方法体参数List(数组)时,获取List集合的泛型类型数组的对象类型直接上代码:(方法体做了简化,其中的Class genericType为泛型类型),有问题或者...
  • 目录 介绍 概念化这个混乱 编码此混乱 下载实用程序-5.7 KB 介绍 ...通过这个技巧,我将努力向读者展示如何使用反射来查询一个集合类的元素类型。...有时我们可能需要通过反射获取集合的元素类型。我通
  • package com.buaa.reflectTest; import java.lang.reflect.Method; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.util.List; import java.util.Map; public class De
  • java反射获取方法参数及返回值类型

    千次阅读 2013-09-08 15:38:48
    package test; import java.lang.reflect.Method; import java.lang.reflect.ParameterizedType; ... import java.lang.reflect.Type;... import java.util.List; import java.util.Map; ...
  • Java-使用反射获取类型信息

    千次阅读 2018-09-18 19:30:33
    Java中如何使用反射获取类型信息?Java中如何使用反射获取类型信息?一个简单类的例子分析如何获取不同属性的类型1、普通类型2、数组类型3、带...在这个类中,有普通的String类型,有数组类型,有带泛型的List类型...
  • **首先贴上代码** ...private static GxbVO PushVo(List<String> listnr){ GxbVO vo=new GxbVO(); Field[] declaredFields = GxbVO.class.getDeclaredFields(); for(int a=0;a<listnr.size();a++...
  • package com.franky.generic... import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.util.ArrayList; import java.util.Date;...import java.util.List;... * @描述 通过反射获取泛型
  • 反射获取List中的泛型

    2017-07-03 19:53:41
    获取List中的泛型类型,创建对象,并且字段设置 for (Field f : partPropType.getDeclaredFields()) { if ("accountPrincipalApproveList".equals(f.getName())) { f.setAccessible(true); ...
  • 今天做项目的时候遇到了个问题,反射获取对象的属性的时候报了一个错误,提示:“参数计数不匹配”。看到错误提示时一脸懵逼,看着字面意思是提示我参数数量不对,可是一般调用方法的时候参数不正确就生成不通过啊...
  • java通过反射获取List中的泛型

    万次阅读 2014-04-21 11:29:40
    Field[] fields = bean.getClass().getDeclaredFields(); for(Field f : fields){ f.setAccessible(true); if(f.getType() == java.util.List... // 如果是List类型得到其Generic的类型 Type
  • 前言 很多人面试之前,可能没有在互联网公司工作过或者说...那么集中把这些算法题做完即可,命中率高达85%+) Er37iZ-1624073373965)] [外链图片转存中…(img-A7KqFCcx-1624073373966)] 资料获取方式:戳这里免费领取
  • 我经常会想获取参数的实际类型,在Hibernate中就利用的这一点。domain: Person.javapublic class Person { // 编号 private Long id; // 姓名 private String name; public Person() { } public P
  • java反射获取聚合<List>属性字段

    千次阅读 2018-08-27 23:42:31
    java反射获取聚合&lt;List&gt;属性字段 2016年09月30日 11:59:40 阅读数:7997 标签: javareflect 更多 个人分类: java 需要动态的传入一个Class的类型,然后反射到启动的List,根据List里定义的...
  • 通过反射我们可以修改对象中的字段的。 就如下面这段代码 Grade grade=new Grade(); Field f=Grade.class.getDeclaredField("name"); f.setAccessible(true); f.set(grade, "三年级一班"); 这是...
  • java反射机制获取泛型参数类型

    千次阅读 2016-10-25 10:48:35
    package com.dasenlin.reflectionconstractor...import java.lang.reflect.Method; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.util.List; import java.util.Map;/** *
  • 反射获取方法参数及返回值类型

    万次阅读 2012-10-23 22:10:46
    package test;    import java.lang.reflect.Method;  import java.lang.reflect.ParameterizedType; ... import java.lang.reflect.Type;... import java.util.List;  import java.util.Map;    pub
  • Springboot AOP利用反射获取请求参数

    千次阅读 2019-09-10 17:45:37
      我们在某些业务场景下需要对接口的入参进行校验或者权限验证,因此需要获取接口的参数列表依次来支持我们的逻辑操作,因此需要我们获取接口的参数,下面是利用自定义注解配合Aop来实现的一个思路: 正常: ...
  • 在开发中需要用到枚举类中变量的所有。如下例季节枚举类中需要获取数组["春", "夏", "秋", "冬"]。 public enum Season { SPRING("春天"), SUMMER("夏天"), AUTUMN("秋天"), WINTER("冬天"); String season...
  • 不确定类型的object对象中的参数,一一对应到类中属性字段中。 转换工具方法 public static <T> List<T> fanSheER(List<Object[]> list, Class T){ if(list == null && list.isEmpty...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 79,983
精华内容 31,993
关键字:

反射获取list类型参数值