Dec 10, 2018
关于java一些零零散散的点(二)
instanceof与Class.isInstance(Object obj)的区别
instanceof
instanceof运算符只能被用于对象引用变量
运算符左侧为被测对象
测试被测对象是否为运算符右侧类或接口的实例
Class.isInstance(Object obj)
obj为被测对象
测试被测对象是否为Class的实例
不定项参数个数的问题
- 传入
单个
数组
数组中每个元素为一个参数 - 传入
多个
数组
每个数组为一个参数 - 传入集合
每个集合为一个参数
JDK动态代理与CGLIB
JDK动态代理
针对接口实现,被代理类需要实现接口,只能代理接口方法,java自带,无需引入外部包CGLIB
通过生成被代理对象的子类实现,可代理被代理对象内public,protected方法,被代理类不能是final类型,需要外部引入包
反射获取方法参数名
java.lang.reflect.Parameter类
通过method.getParameters()获取得到参数
在通过参数getName()
方法得到参数名若得到的事arg0等名称
是因为编译版本小于1.8idea中可通过Java Compiler中设置模块编译版本大于
1.8
并且在Additional command line parameters中
设置-parameters
maven中可以配置插件
1
2
3
4
5
6
7
8
9
10<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<compilerArgument>-parameters</compilerArgument>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
子线程中异常的捕获
- 子线程中的异常,可以根据情况在子线程中处理
- 若需要在父线程中处理,可使用java中的
Future
,
线程池执行任务时,使用submit()
而不是execute()
。 submit
方法有一个返回值,可用于获取线程执行结果,即Future.get()
,该方法在线程内部抛出异常时,可catch到ExecutionException
,使用ExecutionException.getCause()
即可得到内部异常。- 注意
- Future.get()会
阻塞
函数以获取结果
- Future.get()会
一次线程池死锁问题
写在前面:
使用线程池时,不要在Task中嵌套Task
简单解释:
newFixedThreadPool
在当前池内线程全部被使用时,后来的任务会进行排队。此时,一个Task内部提交了一个新的Task,这个新的Task会进行排队。外部Task需要等待内部Task完成才会释放线程给后来的任务使用,而此时内部Task在排队,无法完成,进而导致双方都无法完成,形成死锁。