Java零碎总结

获取当前类运行的根目录(即classpath,如bin、classes、AppName等)的方式有:

1、Thread.currentThread().getContextClassLoader().getResource("").getPath();(获取根目录下的a.pr文件可以是Thread.currentThread().getContextClassLoader().getResource("a.pr"))

2、ClassLoader.getSystemClassLoader().getResource("").getPath()

3、XX.class.getResource("/").getPath(),注意这个要有/,不然它会是XX这个类的包目录而不是classes目录,上面的不能有/否则报错

注:用System.getProperty("user.dir")的方式对于webapp而言不可取。

获取webapp的WEB-INF目录可以用:this.getServletContext().getRealPath("/").concat("WEB-INF/")

获取配置文件可以用:Thread.currentThread().getContextClassLoader().getResourceAsStream("db.properties")

,注意这个方法不能用来获取如.java文件否则会报错(报错原因最终应该是URLClassPath的内部类的FileLoader在getResource中check时发现.java是不允许的后缀所以产生异常从而return null,用了5个反编译器那部分代码都没有反编译出来),在JDK1.8里貌似已经不报错只是返回null而已。

getResource(..)获取的可以是目录、普通文件、jar文件,对于普通文件和目录getProtocol()是file;只返回第一个找到的(优先从父加载器路径加载)

getResources(..)是获取所有加载路径下匹配的文件(从父加载器路径、当前加载器路径加载此文件、目录、jar包等,但不会获取.java)

4.C#里有静态构造方法,Java里没有静态构造方法而是用静态块实现 static {..}

5.Java里最好是不要用大写开头的字段名,如FRkid,否则很容易出问题,比如BeanUtils.copyProperties就会无法copy这个属性,如果外部是这个命名,比如客户端那么可以用JSONProperty来指定序列化的字段名,如果是数据库也是有相关注解可以搞定,所以属性就不要弄这种命名方式了;还有一种只有单个小写字母的最好也不要,比如fSid否则用lombok有可能会出问题(lombok在这种情况的字段生成的getter和setter方法是和正常手写的是不一样的);

6.Java里Optional无法of一个null值,因此无法实现Optional对象是present,但是它里面的值却又是null(用反射实现除外。。),所以没法做到这样的功能在ORM框架里,就是一个字段是Optional如Optional<Integer> prop,我希望它更新null值的时候就of一个null(实际做不到),然后ORM框架判断是present因此设置这个字段为null,而如果我不希望更新null时则直接将prop置为null即可,如果要更新其它非空值则of一个非空值即可。。然而Optional不允许这么做。。(也许ORM框架可以自己搞个允许这么弄的Nullable对象来)【Java8的Optional的isPresent其实就是判断包含的值是否是null。。】;

7.用javac编译记得是javac -encoding UTF-8 xx.java,不然可能会报错(Windows平台)

原文地址:https://www.cnblogs.com/silentdoer/p/8127558.html