
java基础
文章平均质量分 88
西红柿系番茄
知其然,知其所以然。
展开
-
使用建造者模式书写Hadoop MapReduce作业代码
Hadoop的MapReduce作业提交代码,都是相对固定的一段八股文,如下现在,我们就对Job对象的构建封装一个工厂类,以便简化书写。非空的属性放在Builder的构造函数里。/** * MapReduce Job 构造器 * * @author Zhou Huanghua */public class MapRedJobFactory { private MapRedJobFactory() { throw new UnsupportedOperatio原创 2020-09-22 21:41:34 · 506 阅读 · 0 评论 -
Java的单继承多实现问题
最近突然想到一个老生常谈的问题:为什么Java的类不支持多继承(接口支持的哈)?抛开高司令不想搞得太复杂的说法,大概答案就是若子类继承的多个父类拥有相同的成员变量,子类在引用该变量时将无法判别使用哪个父类的成员变量。 若子类继承的多个父类拥有相同的方法,同时子类并未覆盖该方法(若覆盖,则直接使用子类中该方法),那么调用该方法时将无法确定调用哪个父类的方法。那么一个类实现了多个接口,就没有这个问题了吗?在Java 8之前,很容易解释接口定义的变量都是常量,编译时就确定调用关系,使用接口名可原创 2020-05-10 15:50:35 · 1227 阅读 · 0 评论 -
Java中的Type家族简单介绍
之前用反射的时候,基本都是Class。最近弄生成接口文档工具的时候,又接触了一下ParameterizedType,偶然的机会发现两者居然有联系:顶级的接口都是Type。于是就统一整理下Type家族的东西。Type是Java编程语言中所有类型的公共高级接口。它们包括原始类型、参数化类型、数组类型、类型变量和基本类型。原始类型:Class类的实例表示正在运行的Java应用程序中的类和接口。枚...原创 2019-12-10 22:45:28 · 265 阅读 · 3 评论 -
Java获取一个类继承的父类或者实现的接口的泛型参数
泛型的作用就不多介绍了,如果你想具备架构设计能力,那么熟练使用泛型是必不可少的。不多说了,先定义泛型父类和泛型接口:package cn.zhh;public class Parent<T1, T2> {}package cn.zhh;public interface Interface<T> {}然后,定义一个子类,分别继承和实现以上的父类...原创 2019-10-24 22:58:56 · 3638 阅读 · 0 评论 -
线程进入休眠状态的三种方式:Thread.sleep、Object.wait、LockSupport.park
一、线程睡眠Thread.sleep1)需要指定睡眠时间,如Thread.sleep(10_000);// 睡眠10秒// TimeUnit.MINUTES.sleep(1);// 睡眠一分钟2)睡眠时线程状态为TIMED_WAITING(限期等待)。3)需要捕获InterruptedException异常。4)不会释放持有的锁。二、线程等待Object.wait1...原创 2019-05-11 13:08:24 · 6029 阅读 · 0 评论 -
Spring Validation的3种执行校验方式
推荐我的另一篇博文:《利用Aspect/Javassist/动态代理/Lombok等方式省略Controller的参数校验结果处理代码》。Validation的注解就不介绍了,大家可以去看源码包或者网上找相关资料。这里直接说执行校验的3种方式。本文使用的参数注解情况以及请求的参数值如下/** * 用户类 * @author z_hh * @time 2019年4月21日...原创 2019-04-21 11:53:43 · 25391 阅读 · 1 评论 -
利用自定义注解和Aspect实现方法参数的非空校验
日常开发过程中,最常见的异常莫过于NullPointerException,相信大家都对它恨之入骨吧。我也是。空指针异常出现的原因有以下几种: 调用 null 对象的实例方法。 访问或修改 null 对象的字段。 如果一个数组为null,试图用属性length获得其长度时。 如果一个数组为null,试图访问或修改其中某个元素时。 在需要抛出一个异常...原创 2019-01-02 23:42:46 · 4035 阅读 · 2 评论 -
Java8新特性——反射获取方法参数名(附开发工具开启方法)
参考:https://blog.youkuaiyun.com/f641385712/article/details/81291273参考:http://www.mamicode.com/info-detail-2162647.html方法的参数名,在很多时候我们是需要反射得到的。但是在java8之前,代码编译为class文件后,方法参数的类型是固定的,但参数名称却丢失了,这和动态语言严重依赖参数名称形...转载 2019-01-02 20:25:45 · 2929 阅读 · 0 评论 -
Java8新特性
Java 8 (又称为 jdk 1.8) 是 Java 语言开发的一个主要版本。 Oracle 公司于 2014 年 3 月 18 日发布 Java 8 ,它支持函数式编程,新的 JavaScript 引擎,新的日期 API,新的Stream API 等。Java8 新增了非常多的特性,比如 Lambda 表达式 − Lambda允许把函数作为一个方法的参数(函数作为参数传递进方法中。...原创 2019-01-06 20:14:02 · 865 阅读 · 0 评论 -
Java NIO
一、Java NIO简介Java NIO(New IO,或称Non Blocking IO)是从Java 1.4版本开始引入的一个新的IO API,可以替代标准的Java IO API。NIO与原来的IO有同样的作用和目的,但是使用的方式完全不同,NIO支持面向缓冲区的、基于通道的IO操作。NIO将以更加高效的方式进行文件的读写操作。二、Java NIO与传统IO的主要差别1、传统...原创 2019-01-06 16:46:21 · 957 阅读 · 0 评论 -
Java7新特性——NIO.2
NIO.2是一组新的类和方法,主要存在于java.nio包内。主要优点:它完全取代了java.io.File与文件系统的交互。 它提供了新的异步处理类,让你无需手动配置线程池和其他底层并发控制,便可在后台线程中执行文件和网络I/O操作。 它引入了新的Network-Channel构造方法,简化了套接字(Socket)与通道的编码工作。文件I/O的基石:PathPath通常代表文件...原创 2018-08-16 02:23:02 · 1401 阅读 · 0 评论 -
字节码操纵技术——Javassist
一、背景编程语言有静态语言和动态语言之分,例如:C、C++、Java等属于静态语言,JavaScript、Ruby、Python等属于动态语言。动态语言的灵活性非常高,遗憾的是,至今为止,作为Java程序员的我尚未享受到动态编程的乐趣。不过,Java也逐步提供了一些有限的动态编程机制,主要有下面三个方面: (1) 反射 (2) 动态编译 (3) 调用Jav...原创 2018-12-30 19:00:58 · 2388 阅读 · 2 评论 -
Java SPI
参考:https://blog.youkuaiyun.com/sigangjun/article/details/79071850一、什么是SPI?有什么用?先贴一张官方文档的介绍图:总结一下:SPI,全名为Service Provider Interface。API大家都知道吧,它是针对使用者的;而SPI恰好相反,是针对服务提供者的,比如厂商或者插件。我们系统里抽象的各个模块,往往有很多不同...原创 2018-12-30 12:36:46 · 574 阅读 · 0 评论 -
Java内部类序列化
一个类能够序列化,需要满足两个条件:类本身实现序列化接口Serializable 类所有的成员属性实现序列化接口SerializableJava的嵌套类(nested class)一共有四种:static nested class 静态嵌套类 inner class 内部类(非静态) local class 本地类(定义在方法内部) anonymous cla...原创 2018-12-27 15:10:02 · 6046 阅读 · 0 评论 -
利用Java的动态编译、动态加载结合EasyRules实现业务规则的动态性
作为一名专门写bug的Java程序猿,相信大家都会遇到过这样的问题:项目的业务逻辑很复杂,而且还经常变化,今天的一个办理条件是小于5,明天就变成了大于10或者条件作废。这就很头疼了,里面的数字可以抽取到配置文件,但是大于和小于呢?条件作废呢?对于业务规则的复杂性,我们可以使用一些规则引擎来解决代码可读性差的问题。市面上也有不少的规则引擎框架,开源的不开源的,收费的不收费的,我们这里推荐使用的是...原创 2018-12-19 17:05:43 · 17805 阅读 · 14 评论 -
Java枚举
在JDK1.5之前,大家都喜欢用常量表示一些固定变量。但是,由于没有固定范围,只要传入相同类型的对象,编译器是不会报错的。所以,推荐大家使用枚举类型。package cn.zhh.basics;/* * 用法一:常量 * 在JDK1.5 之前,我们定义常量都是: publicstaticfianl.... 。 * 现在好了,有了枚举,可以把相关的常量分组到一个枚举类型里,而且枚举...原创 2018-07-31 17:10:37 · 488 阅读 · 0 评论