精华内容
下载资源
问答
  • java 通过反射遍历所有字段修改值,避免重复set、get 比如一张表里的字段十几个,而这个表里的图片存储字段有八九个,在返回这个实体类的时候,要对图片进行加密或者其他操作,那就要在实体类查询结果出来后,一个个...

    java 通过反射遍历所有字段修改值,避免重复set、get

    比如一张表里的字段十几个,而这个表里的图片存储字段有八九个,在返回这个实体类的时候,要对图片进行加密或者其他操作,那就要在实体类查询结果出来后,一个个的get修复,再set赋值,代码量很多,另外如果有多个接口用到,就会产生重复代码;
    通过java 的反射,遍历所有字段,进行一个判断,取出来的值是带有图片链接的,进行操作,省去了很多代码,下面贴代码
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Component;
    
    import java.beans.PropertyDescriptor;
    import java.lang.reflect.Field;
    import java.lang.reflect.Method;
    
    public class ClassUtil {
       
        private  final Logger logger = LoggerFactory.getLogger(getClass());
    
        /**
         * 通过反射所有字段,带有图片的字段,重新赋值
         *
         * @param obj 对象
         */
        public void setImageValue(Object obj) {
            try {
                Class aClass = obj.getClass();
                Field[] fields = aClass.getDeclaredFields();
                for (Field field : fields) {
                    PropertyDescriptor pd = new PropertyDescriptor(field.getName(),
                            aClass);
                    // 获取get方法
                    Method getMethod = pd.getReadMethod();
                    // 获取set方法
                    Method setMethod = pd.getWriteMethod();
                    // 通过get方法获取到值
                    Object o = getMethod.invoke(obj);
                    if (o != null) {
                        String s = o.toString();
                        if (s.contains("jpg")) {
                            // 业务操作
                            // 更新为新的值
                            setMethod.invoke(obj, builder.toString());
                        }
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
     }
    
    展开全文
  • 我的所有JPA实体类都实现了一个名为Entity的接口,它的定义如下:public interface Entity extends Serializable {// some methods}我的JPA实体的一些字段在它们之上有@Column注释,而有些则没有. MyEntity类的定义...

    我的所有JPA实体类都实现了一个名为Entity的接口,它的定义如下:

    public interface Entity extends Serializable {

    // some methods

    }

    我的JPA实体的一些字段在它们之上有@Column注释,而有些则没有. MyEntity类的定义如下:

    @Entity

    public class MyEntity implements Entity {

    @Id

    private Long id; // Assume that it is auto-generated using a sequence.

    @Column(name="field1")

    private String field1;

    private SecureString field2; //SecureString is a custom class

    //getters and setters

    }

    我的删除方法接受实体.

    @Override

    public void delete(Entity baseEntity) {

    em.remove(baseEntity); //em is entityManager

    }

    每当调用delete方法时,我想在delete方法中有三件事:

    1)MyEntity的类型为SecureString的字段

    2)DB中该特定字段的列名(该字段可能有也可能没有@Column注释)

    3)id字段的值

    请注意,当调用delete()方法时,我们不知道它被调用的实体,可能是MyEntity1,MyEntity2等.

    我试过做类似下面的事情:

    for (Field field : baseEntity.getClass().getFields()) {

    if (SecureString.class.isAssignableFrom(field.getType())) {

    // But the field doesn't have annotation @Column specified

    Column column = field.getAnnotation(Column.class);

    String columnName = column.name();

    }

    }

    但这只有在字段有@Column注释时才有效.它也没有让我得到我需要的其他两件事.有任何想法吗?

    解决方法:

    Hibernate可以使用不同的naming strategies来映射属性名称,这些属性名称是隐式定义的(没有@Column(name =“…”)).要拥有“物理”名称,您需要深入了解Hibernate内部.首先,您必须将EntityManagerFactory连接到您的服务.

    @Autowired

    private EntityManagerFactory entityManagerFactory;

    其次,您必须为您的类检索AbstractEntityPersister

    SessionFactory sessionFactory = entityManagerFactory.unwrap(SessionFactory.class);

    AbstractEntityPersister persister = ((AbstractEntityPersister)sessionFactory.getClassMetadata(baseEntity.getClass()));

    第三,你的代码几乎就在那里.你只需要处理这两种情况 – 有和没有@Column注释.试试这个:

    for (Field field : baseEntity.getClass().getFields()) {

    if (SecureString.class.isAssignableFrom(field.getType())) {

    String columnName;

    if (field.isAnnotationPresent(Column.class)) {

    columnName = field.getAnnotation(Column.class).name();

    } else {

    String[] columnNames = persister.getPropertyColumnNames(field.getName());

    if (columnNames.length > 0) {

    columnName = columnNames[0];

    }

    }

    }

    }

    请注意,getPropertyColumnNames()仅检索“属性”字段,这些字段不是主键的一部分.要检索键列名,请使用getKeyColumnNames().

    关于id字段.你真的需要在儿童班中拥有所有@Id?也许最好将@Id移动到Entity类并用@MappedSuperclass注释标记这个类?然后你可以使用baseEntity.getId()来检索它;

    标签:java,reflection,jpa,hibernate,java-ee

    来源: https://codeday.me/bug/20190522/1153665.html

    展开全文
  • ArrayList这个类是实现了RandomAccess接口的,RandomAccess接口和Serializable接口一样都是没有方法或者字段的,像是一个标志,RandomAccess接口文档说明的是:Marker interface used by <tt>List<...

    ArrayList这个类是实现了RandomAccess接口的,RandomAccess接口和Serializable接口一样都是没有方法或者字段的,像是一个标志,

    RandomAccess接口文档说明的是:Marker interface used by <tt>List</tt> implementations to indicate thatthey support fast (generally constant time) random access. [(标记接口用于List继承表名支持快速随机访问)]

    这个接口在Collections类中用的很多,用于判断是否是RandomAccess接口的实例(其实就是多态的应用)[list instanceof RandomAccess]根据是否实现该接口,来选用不同的算

    贴源码注释+自己的翻译:

    /**
     * Marker interface used by <tt>List</tt> implementations to indicate that
     * they support fast (generally constant time) random access.  The primary
     * purpose of this interface is to allow generic algorithms to alter their
     * behavior to provide good performance when applied to either random or
     * sequential access lists.
     * 
     * 标记该接口用来被List实现指示他们支持快速随机访问. 这个接口的主要目的就是允许一般算法去修改他们的
     * 行为以提供更好的表现:当被应用与随机或者顺序方式列表时.
     *
     * <p>The best algorithms for manipulating random access lists (such as
     * <tt>ArrayList</tt>) can produce quadratic behavior when applied to
     * sequential access lists (such as <tt>LinkedList</tt>).  Generic list
     * algorithms are encouraged to check whether the given list is an
     * <tt>instanceof</tt> this interface before applying an algorithm that would
     * provide poor performance if it were applied to a sequential access list,
     * and to alter their behavior if necessary to guarantee acceptable
     * performance.
     *
     * 操作随机访问列表的lists时比如ArrayList的最好的算法当应用于顺序访问列表如LinkedList时,可能会产生二次项行为
     * (妈的,什么是二次项行为啊!韩老师说(a+b)^2展开就是)
     * 在应用算法之前通用列表算法鼓励去检查这个list是否是该接口的实例,如果应用于顺序访问列表时,
     * 则会提供较差的性能,并且在必要时去警告他们行为来保证可接受的性能.
     *
     * <p>It is recognized that the distinction between random and sequential
     * access is often fuzzy.  For example, some <tt>List</tt> implementations
     * provide asymptotically linear access times if they get huge, but constant
     * access times in practice.  Such a <tt>List</tt> implementation
     * should generally implement this interface.  As a rule of thumb, a
     * <tt>List</tt> implementation should implement this interface if,
     * for typical instances of the class, this loop:
     * <pre>
     *     for (int i=0, n=list.size(); i &lt; n; i++)
     *         list.get(i);
     * </pre>
     * runs faster than this loop:
     * <pre>
     *     for (Iterator i=list.iterator(); i.hasNext(); )
     *         i.next();
     * </pre>
     *    
     *  我们意识到在随机访问和顺序访问的区别通常是模糊的,比如,列表很大时,一些list的实现提供了
     *  渐进线性访问时间,但在实际中时间是不变的.这样的List应该实现该接口,
     *  作为一个经验法则,一个接口应该尽量实现这个这个接口,
     *  对于这个接口的实现使用for循环笔使用iterator循环更快
     *
     * <p>This interface is a member of the
     * <a href="{@docRoot}/../technotes/guides/collections/index.html">
     * Java Collections Framework</a>.
     *
     * @since 1.4
     */

     以上是对于RandomAccess接口的描述,一句话概括就是,在使用循环遍历List的时候应该判断下这个集合是否是RandomAccess的实例,如果是就是用for循环来操作,如果不是就是使用iterator迭代器来操作.可是为什么要这么做的?这要从数据结构的角度来说了

    首先看一下实现了RandomAccess接口的ArrayList的接口,一般人都知道ArrayList就是一个数组

    然后看下没有实现RandomAccess接口的LinkedList,顾名思义就是一个链表

    先看一下链表和数组的区别:

    数组像是身上都有了编号排成一排的人,你要找第几个直接根据编号去找,就是所谓的根据下标去查询,所以在查询的时候很快,但是如果要插入就变得很慢了,你还要给插入位置之后的其他人重新定义编号,删除同理,效率肯定慢.

    链表就像是牵手站成一排的人,你要找第几个就要一个一个取数,从1数到n,但是插入的时候直接把人分开,重新牵手就可以,无需编号,删除同理.

    所以如果用for循环遍历的话,贴个代码看看:

    /**
     * Collections 测试RandomAccess随机访问速度
    */
    List<String> l = new ArrayList<String>();
    List<String> _l = new LinkedList<String>();
    for(int i=0;i<100000;i++){
        l.add(String.valueOf(i));
        _l.add(String.valueOf(i));
    }
    long startTime = System.currentTimeMillis();
    for(int i=0;i<l.size();i++){
        l.get(i);
    }
    System.out.println("count:"+(System.currentTimeMillis()-startTime));
    startTime = System.currentTimeMillis();
    for(int i=0;i<_l.size();i++){
        _l.get(i);
    }
    System.out.println("count:"+(System.currentTimeMillis()-startTime));
    startTime = System.currentTimeMillis();
    for(Iterator<String> it=_l.iterator();it.hasNext();){
        it.next();
    }
    System.out.println("count:"+(System.currentTimeMillis()-startTime));
    
    输出结果就是:(ArrayList)count:0 (LinkedList)count:14760 (LinkedList)count:10
    

    惊讶吧!开始分析!ArrayList不用管,就是根据下边直接去查,看下普通for循环下LinkedList为啥贼鸡儿慢!

    看一下LinkedList的get方法

    判断index在整体的前部还是后部,在前部就从前往后遍历,在后部就从后向前遍历,每次都这样从头遍历,能不慢么,算法复杂度有n^2了吧
    
    Node<E> node(int index) {
            // assert isElementIndex(index);
            if (index < (size >> 1)) {
                Node<E> x = first;
                for (int i = 0; i < index; i++)
                    x = x.next;
                return x;
            } else {
                Node<E> x = last;
                for (int i = size - 1; i > index; i--)
                    x = x.prev;
                return x;
            }
        }
    

     然后看下LinkedList的Iterator方法为啥挺快呢?通过实现类看到:

    具体参考java集合学习之List(三)以LinkedList为例,debug看下迭代器的实现.

    返回一个迭代器,然后判断是否有下一个节点,有的话就得到当前节点的next,不必再去多于的循环遍历.所以速度肯定很快.

    -----------------------------------------------------------------------------------------------------

    之前我的疑问在于这个LinkedList的Node节点是如何赋值的,今天又仔细看了下源码才他妈的看到的add的时候给Node复制的!!一定要看全啊....还是数据结构不熟悉

    展开全文
  • 有一天我调用接口遍历执行sql时,在控制器输出发现肉眼可见的龟速执行,差不多1-2秒一次sql执行。 于是我拿来sql语句在mysql上使用explain执行,发现没有走索引。 然后仔细看了一下sql,缺少了单引号或者双引号,这...

    有一天我调用接口遍历执行sql时,在控制器输出发现肉眼可见的龟速执行,差不多1-2秒一次sql执行。
    于是我拿来sql语句在mysql上使用explain执行,发现没有走索引。

    然后仔细看了一下sql,缺少了单引号或者双引号,这个sql没有报错是因为存入的是全数字的手机号,所以where条件一直都是数字没怎么注意

    加上单引号或者双引号,解决!

    展开全文
  • 遍历结果集: 【总结】 两种思想: 面向接口编程的思想 ORM编程思想:(object relational mapping) 一个数据表对应一个java类 表中的一条记录对应java类的一个对象 表中的一个字段对应java类的一个属性 两种技术...
  • // Field 提供有关类或接口的单个字段的信息,以及对它的动态访问权限 // getDeclaredFields()返回Class中所有的字段,包括私有字段 // getFields 只返回公共字段,即有public修饰的字段 // ...
  • 有38万多个地址,想到的方案就是查出所有的地址字段加上主键字段,然后导出csv文件,读取这个文件,遍历请求百度api接口,获取经纬度信息,生成一个新的文件,作为一张表导入数据库,使用sql给地址刷一遍经纬度。...
  • 最近在做JAVA 3D API重写,重写的结果需要与原有的API结果进行比较,只有结果一致时才能说明接口是等价重写的,为此需要做一个API结果比较的工具,比较的内容就是Json内容,但是为了实现宽泛的内容相等即只需要字段...
  • 有38万多个地址,想到的方案就是查出所有的地址字段加上主键字段,然后导出csv文件,读取这个文件,遍历请求百度api接口,获取经纬度信息,生成一个新的文件,作为一张表导入数据库,使用sql给地址刷一遍经纬度。...
  • // 遍历所有的响应头字段 for (String key : map.keySet()) { System.out.println(key + "--->" + map.get(key)); } // 定义 BufferedReader输入流来读取URL的响应 in = new BufferedReader(new ...
  • Java jdbc回填

    2020-10-19 19:28:30
    接着再实现接口方法,首先是查询下拉框里的值的sql语句,接着是链接数据库封装的一个类,接着把查出来的值放到一个数组里,然后在遍历拿到具体下拉框数据的值,最后是一个关闭流操作,并返回数组。(findDepartment...
  • Java 8 Lambda使用

    2020-10-20 11:43:07
    Java 8 Lambda使用Lambda介绍本质函数式接口函数式接口定义stream流的Intermediate方法(中间操作)流的Terminal方法(终结操作)filtermapsorted自然排序自定义排序使用Stream进行多字段排序Collector Lambda 介绍 ...
  • Java jdbc 多表修改

    2020-10-19 19:23:21
    接着在实现接口类中实现接口方法,先是一个链接数据库的封装方法,接着是修改的sql语句,然后遍历每一个需要修改的字段,接着是一个成功的判断并且打印成功修改的ID,最后是一个关闭流操作。 在实现接口方法前,...
  • Java Map是否有序?

    万次阅读 2018-10-23 20:49:22
    | 背景 在调用接口A的时候,传给... 接口B返回的字段是数组类型 ClassX[] , 传给接口A的字段是JSON字符串。我将数组ClassX[] 遍历,然后把key,value重新传入了一个Map,而这个Map 是 new HashMap产生的。最后调...
  • Android项目需求,要对一个ListView进行多字段模糊过滤,系统自带的ArrayAdapter是有过滤功能,但是项目使用的是BaseAdapter适配器, List做数据源, 如果要实现过滤的话,就要遍历原始的List后重新生成新的List,至少需要...
  • 文章目录1.File类File类的构造方法File类的常用方法:1.1对一些构造...文件过滤器(了解)3.1FileFilter接口3.1.1accept()方法3.2初步代码演示3.2.1创建一个过滤文件的接口class3.2.2创建遍历文件的方法listFile(File)3.
  • Java】xml转实体

    热门讨论 2018-04-17 16:40:51
    引言因为项目中需要把webservice接口提供的数据直接保存下来,一般字段少的就直接遍历,然后合成SQL存到数据库;但是有的提供了30多个字段遍历拼接就很繁琐,所以,写了一个简单的xml转实体,然后根据实体生成SQL...
  • 有38万多个地址,想到的方案就是查出所有的地址字段加上主键字段,然后导出csv文件,读取这个文件,遍历请求百度api接口,获取经纬度信息,生成一个新的文件,作为一张表导入数据库,使用sql给地址刷一遍经纬度。...
  • 有38万多个地址,想到的方案就是查出所有的地址字段加上主键字段,然后导出csv文件,读取这个文件,遍历请求百度api接口,获取经纬度信息,生成一个新的文件,作为一张表导入数据库,使用sql给地址刷一遍经纬度。...
  • 这个类,主要是供HashMap等继承的一个抽象类。 1. 对Map接口的实现,基本都是基于entrySet的操作...3. 还提供了这两个字段,用于对keyset,values的获取遍历。 transient Set<K> keySet; transient Collect...
  • 实习期间一个任务需要对接webservice接口,并将返回来的数据更新到自己的数据库中,其中将返回的数据转换为自己代码中的实体类就是通过反射实现的 过程 创建好对应的实体类和Dao层 将返回的数据转换为List<...
  • 结构、null键null值HashMap是基于Hash表对Map接口的实现,HashMap具有较快的访问速度,但是遍历的顺序却是不确定的,HashMap提供所有可选的映射操作,并允许使用null键和null值。线程不安全HashMap并非线程安全,当...
  • 调用别人家接口不知道为null是哪个字段造成的 期望: 标题显示完整,不出现null 做法: 对实体类属性遍历,对所有为空的属性,赋值为空字符串 Code: //实体类 TestUtil test = new TestUtil(); test....
  • 6、什么样的字段适合建索引 41 7、索引类型有哪些? 42 8、什么是事务?什么是锁? 42 9、什么叫视图?游标是什么? 43 10、视图的优缺点 43 11、列举几种表连接方式,有什么区别? 43 12、主键和外键的区别? 44 13...
  • Java经典编程300例(code)

    千次下载 热门讨论 2013-01-09 10:26:53
    实例181 使用枚举接口遍历元素 250 实例182 使用泛型实现栈结构 251 实例183 自定义泛型化数组类 253 实例184 泛型方法与数据查询 254 实例185 使用通配符增强泛型 256 实例186 泛型化的折半查找法 257 第14章 Swing...
  • 现在公司是sqlserver到mysql,要用代码实现初始化的数据搬迁工作,暴露出来初始化接口 问题描述: 数据库使用的是mybatis框架,对于有的表,例如97个字段,一百多万条数据,直接就内存溢出了。 解决办法: ① mapper...
  • 如果表里的一行数据其中任何一个(包含一个以上)字段的值为空,那么遍历list之后得到的就是一个null。 请教各位这是什么原因引起的,是不是和我的配置文件无主键这种方式有关,谢谢。 [b]问题补充:[/b] 请教...
  • / 139 6.3.2 常量池 / 141 6.3.3 访问标志 / 147 6.3.4 类索引、父类索引与接口索引集合 / 148 6.3.5 字段表集合 / 149 6.3.6 方法表集合 / 153 6.3.7 属性表集合 / 155 6.4 Class文件结构的发展 / 168 6.5 ...

空空如也

空空如也

1 2 3
收藏数 59
精华内容 23
关键字:

java遍历接口字段

java 订阅