cglib

Java 代码精简之道

最后都变了- 提交于 2020-11-08 14:58:50
文 | 常意 前言 古语有云: 道为术之灵,术为道之体;以道统术,以术得道。 其中:“道”指“规律、道理、理论”,“术”指“方法、技巧、技术”。意思是:“道”是“术”的灵魂,“术”是“道”的肉体;可以用“道”来统管“术”,也可以从“术”中获得“道”。 工匠追求“术”到极致,其实就是在寻“道”,且离悟“道”也就不远了,亦或是已经得道,这就是“工匠精神”——一种追求“以术得道”的精神。如果一个工匠只满足于“术”,不能追求“术”到极致去悟“道”,那只是一个靠“术”养家糊口的工匠而已。作者根据多年来的实践探索,总结了大量的 Java 代码精简之“术”,试图阐述出心中的 Java 代码精简之“道”。 1.利用语法 1.1.利用三元表达式 普通: String title; if (isMember(phone)) { title = "会员"; } else { title = "游客"; } 精简: String title = isMember(phone) ? "会员" : "游客"; 注意:对于包装类型的算术计算,需要注意避免拆包时的空指针问题。 1.2.利用 for-each 语句 从 Java 5 起,提供了 for-each 循环,简化了数组和集合的循环遍历。 for-each 循环允许你无需保持传统 for 循环中的索引就可以遍历数组,或在使用迭代器时无需在 while

想去阿里?就不要错过这些Java面试题

南笙酒味 提交于 2020-11-02 18:43:04
前言 相信很多小伙伴都想去大厂工作,今天小编给大家分享下阿里Java面试题和面试流程,希望能够帮助到各位小伙伴。 面试流程 先说下面试流程,一般大公司都有3-4轮技术面,1轮的HR面。 前面几轮技术面主要问的是一些基础、项目实现和拓展,最后一轮技术面是部门老大面,主要就问一些架构、技术和业务的理解,因为这个时候他看的就是你的潜力,就是看你有没有培养的价值。 HR面主要就是跟你聊聊天,很多人在HR面后挂了,一般不是因为你不表现不好,可能是你之前几面的表现一般,公司基于hc、人才配比、与其他候选人的对比等多个维度考虑,最终决定是否给你offer。 下面列出了一面问到的问题: 阿里一面(电面) synchronized与lock的区别,使用场景。看过synchronized的源码没 JVM自动内存管理,Minor GC与Full GC的触发机制 了解过JVM调优没,基本思路是什么 如何设计存储海量数据的存储系统 缓存的实现原理,设计缓存要注意什么 淘宝热门商品信息在JVM哪个内存区域 操作系统的页式存储 volatile关键字的如何保证内存可见性 happen-before原则 Lucene全文搜索的原理 阿里二面: 自我介绍下自己,不超过3分钟 你说你熟悉并发编程,那么你说说Java锁有哪些种类,以及区别 如何保证内存可见性 Http请求的过程与原理 TCP连接的特点

为什么阿里巴巴禁止使用Apache Beanutils进行属性的copy?

蹲街弑〆低调 提交于 2020-11-02 07:37:16
点击这段文字获取: 5个可以写到简历的项目实战视频教程(含源码) 在日常开发中,我们经常需要给对象进行赋值,通常会调用其set/get方法,有些时候,如果我们要转换的两个对象之间属性大致相同,会考虑使用属性拷贝工具进行。 如我们经常在代码中会对一个数据结构封装成DO、SDO、DTO、VO等,而这些Bean中的大部分属性都是一样的,所以使用属性拷贝类工具可以帮助我们节省大量的set和get操作。 市面上有很多类似的工具类,比较常用的有 1、Spring BeanUtils 2、Cglib BeanCopier 3、Apache BeanUtils 4、Apache PropertyUtils 5、Dozer 那么,我们到底应该选择哪种工具类更加合适呢?为什么阿里巴巴Java开发手册中提到禁止使用Apache BeanUtils呢?  由于篇幅优先,关于这几种工具类的用法及区别,还有到底是什么是浅拷贝和深拷贝不在本文的讨论范围内。 本文主要聚焦于对比这几个类库的性能问题。 性能对比 No Data No BB,我们就来写代码来对比下这几种框架的性能情况。 代码示例如下: 首先定义一个PersonDO类: public class PersonDO { private Integer id; private String name; private Integer age;

2020Java面试试题及答案(基础部分)

与世无争的帅哥 提交于 2020-11-01 14:44:00
世人慌慌张张,不过图碎银几两。偏偏这碎银几两,能解世间万种慌张。最近实在揭不开锅了,有了换工作的想法,网上整理了部分Java基础面试题,好东西要拿出来分享。好了不多说了进入正题。 如果你不想再体验一次自学时找不到资料,没人解答问题,坚持几天便放弃的感受的话,可以加我们的扫描二维码,各种面试资料简历模板免费送! 1、面向对象的三个特征 封装(即包装或隐藏): 封装从字面上来理解就是包装的意思,专业点就是信息隐藏。它指的是将对象的数据、状态信息和对数据的操作方法及细节隐藏在对象内部, 不允许外部程序直接访问对象的内部信息或直接对对象进行操作,而是向外提供一些安全可靠的方法供外部程序对对象进行安全的访问和操作。 好处: 隐藏信息和实现细节 可以对成员进行更精确的控制,限制对对象的不合理访问 便于修改,提高代码的可维护性 良好的封装能够减少耦合 继承: 使用现有的类的所有功能,并无须重新编写原来的这些类的基础上对这些功能进行扩展(可以增加新的数据或新的功能)。 特点: 子类拥有父类非private的属性和方法 子类可以拥有自己属性和方法,即子类可以对父类进行扩展 子类可以重写父类已实现的方法 多态: 所谓多态就是一个实例的相同方法在不同的情形下有不同的表现形式,即程序中定义的引用变量所指向的具体类型和通过引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定

设计模式之代理模式

落爺英雄遲暮 提交于 2020-10-29 14:14:08
代理模式 通过代理控制对象的访问,可以详细访问某个对象的方法,在这个方法调用处理,或调用后处理。既(AOP微实现) ,AOP核心技术面向切面编程。 1、代理模式应用场景 SpringAOP、事物原理、日志打印、权限控制、远程调用、安全代理 可以隐蔽真实角色 2、代理的分类 静态代理(静态定义代理类) 动态代理(动态生成代理类) Jdk自带动态代理 Cglib 、javaassist(字节码操作库) 3、静态代理 由程序员创建或工具生成代理类的源码,再编译代理类。所谓静态也就是在程序运行前就已经存在代理类的字节码文件,代理类和委托类的关系在运行前就确定了。 1)、静态代理代码 public interface IUserDao { void save(); } public class UserDao implements IUserDao { public void save() { System.out.println("已经保存数据..."); } } 代理类 public class UserDaoProxy implements IUserDao { private IUserDao target; public UserDaoProxy(IUserDao iuserDao) { this.target = iuserDao; } public void save() {

Java 动态代理的原理

半世苍凉 提交于 2020-10-29 11:26:58
做开发的都知道,编程语言可以从运行时还是编译时检查分为动态类型和静态类型。对于Java来说,通常认为它是静态的强类型语言,但是因为Java提供反射的机制,也具备了部分动态类型语言的能力。这一节,我们就讲一讲Java的动态代理。 动态代理是一种用于运行时动态构建代理,动态处理代理方法调用的机制。它首先是一种机制。在设计模式中有一种模式叫做代理模式(Proxy Pattern),和动态代理类似,其中代理可以看作是对调用目标的一个包装,通过代理完成对目标对象的调用。这其实也是一种解耦。 实现动态代理的机制有很多,比如JDK自身提供的动态代理JDK Proxy(利用Java语言的反射机制),其他方式有ASM,CGLIB<基于ASM>,Javassit等。动态代理机制主要应用有面向切面AOP、拦截器、RPC调用、日志、事务等等。 我们先来探究JDK Proxy机制<基于反射>----通过接口。新版本也开始结合ASM机制。它涉及到最重要的类和接口就是Proxy和InvocationHandler。先熟悉他们一下。 Proxy这个类的作用就是用来动态创建一个代理对象的类,它最常用到的方法是newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h) InvocationHandler接口只有一个方法

三问Spring事务:解决什么问题?如何解决?存在什么问题?

我与影子孤独终老i 提交于 2020-10-28 15:17:21
1. 解决什么问题 让我们先从事务说起,“什么是事务?我们为什么需要事务?”。事务是一组无法被分割的操作,要么所有操作全部成功,要么全部失败。我们在开发中需要通过事务将一些操作组成一个单元,来保证程序逻辑上的正确性,例如全部插入成功,或者回滚,一条都不插入。作为程序员的我们,对于事务管理,所需要做的便是进行事务的界定,即通过类似begin transaction和end transaction的操作来界定事务的开始和结束。 下面是一个基本的JDBC事务管理代码: // 开启数据库连接 Connection con = openConnection(); try { // 关闭自动提交 con.setAutoCommit(false); // 业务处理 // ... // 提交事务 con.commit(); } catch (SQLException | MyException e) { // 捕获异常,回滚事务 try { con.rollback(); } catch (SQLException ex) { ex.printStackTrace(); } } finally { // 关闭连接 try { con.setAutoCommit(true); con.close(); } catch (SQLException e) { e.printStackTrace(); }

Digester

风流意气都作罢 提交于 2020-10-28 15:15:16
1. 介绍 这是一个apache 用于解析XML的工具类,这里依赖到的包有以下几个 commons-digester3-3.2.jar cglib-2.2.2.jar asm-3.3.1.jar commons-beanutils-1.8.3.jar commons-logging-1.1.1.jar 2.案例说明 下面就用一个实际的几个类来说明他的用法 测试类 import java.io.File; import java.io.IOException; import org.apache.commons.digester3.Digester; import org.xml.sax.SAXException; import com.io.test.apache.digester.model.DigesterRule; import com.io.test.apache.digester.model.School; import com.io.test.apache.digester.model.SchoolClass; public class DigesterTest { public static void main(String[] args) { // 创建一个Digester Digester d = new Digester(); // 添加规则组 d

面试阿里,腾讯,字节跳动90%都会被问到的Spring中的循环依赖

百般思念 提交于 2020-10-26 08:23:13
前言 Spring中的循环依赖一直是Spring中一个很重要的话题,一方面是因为源码中为了解决循环依赖做了很多处理,另外一方面是因为面试的时候,如果问到Spring中比较高阶的问题,那么循环依赖必定逃不掉。如果你回答得好,那么这就是你的必杀技,反正,那就是面试官的必杀技,这也是取这个标题的原因,当然,本文的目的是为了让你在之后的所有面试中能多一个必杀技,专门用来绝杀面试官! 本文的核心思想就是, 当面试官问: “请讲一讲Spring中的循环依赖。”的时候, 我们到底该怎么回答? 主要分下面几点 什么是循环依赖? 什么情况下循环依赖可以被处理? Spring是如何解决的循环依赖? 同时本文希望纠正几个目前业界内经常出现的几个关于循环依赖的错误的说法 只有在setter方式注入的情况下,循环依赖才能解决(错) 三级缓存的目的是为了提高效率(错) OK,铺垫已经做完了,接下来我们开始正文 什么是循环依赖? 从字面上来理解就是A依赖B的同时B也依赖了A,就像下面这样 体现到代码层次就是这个样子 @Component public class A { // A中注入了B @Autowired private B b; } @Component public class B { // B中也注入了A @Autowired private A a; } 当然,这是最常见的一种循环依赖

面试官问 Spring AOP 中两种代理模式的区别,我懵逼了

谁都会走 提交于 2020-10-25 11:16:08
基本介绍 代理模式 是一种结构性设计模式。为对象提供一个替身,以控制对这个对象的访问。即通过代理对象访问目标对象,并允许在将请求提交给对象前后进行一些处理。 被代理的对象可以是远程对象、创建开销大的对象或需要安全控制的对象。 代理模式主要有三种不同的形式: 静态代理:由程序员创建代理类或特定工具自动生成源代码再对其编译。在程序运行前代理类的 .class 文件就已经存在了 动态代理(JDK 代理、接口代理):在程序运行时运用反射机制动态创建而成,动态就是在程序运行时生成的,而不是编译时。 cglib 代理(可以在内存动态的创建对象,而不是实现接口,属于动态代理的范畴) 问题 为什么要控制对于某个对象的访问呢?举个例子:有这样一个消耗大量系统资源的巨型对象, 你只是偶尔需要使用它, 并非总是需要。 你可以实现延迟初始化:在实际有需要时再创建该对象。对象的所有客户端都要执行延迟初始代码。不幸的是, 这很可能会带来很多重复代码。 在理想情况下, 我们希望将代码直接放入对象的类中, 但这并非总是能实现:比如类可能是第三方封闭库的一部分。 解决方案 代理模式建议新建一个与原服务对象接口相同的代理类, 然后更新应用以将代理对象传递给所有原始对象客户端。代理类接收到客户端请求后会创建实际的服务对象, 并将所有工作委派给它。 代理将自己伪装成数据库对象,