Java技巧
Java实用小技巧
byx2000
这个作者很懒,什么都没留下…
展开
-
Java中将标准输入和输出重定向到字节流
在Java程序中,可以通过给System.in和System.out重新赋值来重定向标准输入和输出。在单元测试的时候,为了对涉及到标准输入和输出的程序进行测试,常用的做法是将标准输入和输出重定向到文件,这样就可以用程序实现自动化的比对。但是这样做会有文件读取的开销,可能会降低单元测试的运行效率。所以,更优的做法是将标准输入和输出重定向到字节流,这样就能避免文件读取的开销。为了实现以上的效果,可以封装一个叫做getOutput的工具函数,它以字符串的形式传递标准输入内容,并以字符串的形式返回标准输出的内原创 2022-05-03 10:21:44 · 675 阅读 · 0 评论 -
加速Java异常类的创建
大家都知道,Java在创建异常对象时会生成调用栈信息,这样当异常抛出时,开发者就能从报错信息中看到异常抛出的路径,非常有利于定位问题。但是,调用栈信息的生成是一件非常耗时的工作。在某些特殊情况下,我们需要用异常来实现控制流跳转(比如从多层递归中跳出),此时不需要生成调用栈信息。在这种情况下,关闭异常的调用栈信息生成将会极大地提升程序的运行效率。public class FastException extends RuntimeException { public FastException()原创 2022-04-26 21:30:14 · 413 阅读 · 0 评论 -
Java中获取Lambda表达式的参数类型和返回值类型
Java 1.8之后,新增了一个叫做SerializedLambda的类,它用来保存Lambda表达式序列化之后的数据,通过SerializedLambda可以获取Lambda表达式的各种元信息,包括参数类型、返回值类型等。下面的代码可以获取一个Lambda表达式对应的SerializedLambda实例:interface Function2<R, T1, T2> extends Serializable { R apply(T1 t1, T2 t2);}try {原创 2022-02-21 21:12:02 · 2631 阅读 · 0 评论 -
Java中获取lambda表达式的泛型类型
假设有以下接口:public interface Factory<T> { T create();}这是一个泛型接口,在实现Factory的时候需要指定泛型参数:public class StringFactory implements Factory<String> { @Override public String create() { return "hello"; }}public class IntegerFa原创 2021-12-12 18:37:39 · 1325 阅读 · 0 评论 -
Java反射中与自动装箱有关的坑及其解决方案
Java反射中与自动装箱有关的坑最近在写一个项目,里面需要频繁使用反射操作。由于Java的反射API使用起来比较复杂,所以我决定把常用的反射操作封装成一个工具类:ReflectUtils。在ReflectUtils中,有这么一个call方法:public static <T> T call(Object obj, String methodName, Object... params);这个方法利用反射调用某个实例对象的某个方法,obj是对象实例,methodName是方法名,para原创 2021-02-25 12:57:20 · 141 阅读 · 2 评论 -
解决构造函数导致的循环依赖
本篇文章介绍如何解决由构造函数导致的循环依赖问题原创 2021-02-16 17:04:33 · 526 阅读 · 0 评论 -
在Java中使用泛型消除强制类型转换
在Java中使用泛型消除强制类型转换假设类X有一个getObject方法,返回一个Object类型的数据:public class X{ public Object getObject(...) { ... return obj; }}使用X的代码如下:X x = ...;A a = (A) x.getObject(...);B b = (B) x.getObject(...);C c = (C) x.getObject(...);原创 2021-02-08 10:16:02 · 2271 阅读 · 1 评论