发表于: 2017-09-05 22:31:08
2 1007
一、 今天完成的事情
1) 深度思考
1) Q4补充:log4j相对system.out的优势
① 上一篇日报中提到,log4j能显示调试信息。
开发中项目经常是脱离ide的,若这时候需要调试程序。那么可以使用system.out.print来打印信息,但是调试完毕呢?这个代码势必要注释或删除掉,一行一行的操作实在浪费时间。此时,若原本使用的是log4j来打印信息,则只需要更改配置文件中的输出信息级别即可完成关闭打印。
示例:
首先,在需要调试的地方插入打印语句,这里我选择的是logger的debug方法,因为我的配置文件最低输出日志级别是info:
然后,更改log4j配置文件中输出到控制台的日志信息最低级别不大于debug
并且确保root输出的最低级别不大于debug
这样,就可以进行调试了。此外,若是程序在服务器中运行时需要调试,无法输出到控制台,这时可以直接将信息写入文本文件。在配置文件中新增一个appender,存储调试信息:
调试完毕后,不需要这些输出信息了,也不需要逐行注释或删除代码,直接将上面两个最低级别改为大于debug即可(如:info、error等)
② 想不出来了……
2) Q17、为什么要使用Interface,而不是直接使用一个实体类来完成任务?Interface和Impl这种方式的好处是什么?
① 使用接口的意义?
接口,指的是一系列方法声明的集合,是一套统一的规范。
打个比方,计算机上的usb接口就是这样一种存在,它规定外接设备必须通过接口连接上计算机。假若没有这个接口,计算机需要外接键盘、鼠标、U盘等设备时,难道每一种设备都提供一种特有的连接方式?…显然不可行,于是使用了usb接口
小结一下:
首先,接口规定一个协议,遵守此协议的类需要类必须实现协议中声明的方法。
其次,当调用者使用接口的实现时,只需使用接口作为引用的类型(编译类型),可以保证使用相同的方式操作不同的对象而不用知道正在操作的对象到底是什么。
最后,对于接口实现者来说,实现接口保证了其规定的方法添加到自身中,并允许调用者以接口类型的引用方法操作,以此实现运行时多态
② 那么接口与实现分离,即面向接口编程有什么好处?
1) 解耦合,调用者无须关注具体实现
2) 提高团队开发效率
3) 封装,隐藏实现细节
4) …?
③ 具体示例:
1) 解耦合,调用者无须关注具体实现
松耦合是开发中所追求的,可以减少类与类间的依赖。
例如,使用spring时service层通过context容器获取bean实例
这里,ApplicantDao是一个接口,通过getBean方法读取spring配置获取ApplicantDao的实现类的实例。
而当需要更改Dao实现类时,只需要改动class的值为新的实现类全限定名即可。
回过头来,若不适用接口与实现分离,源代码中则为ApplicantDaoImpl dao = new ApplicantDaoIml();
更改实现类时,需要修改service层中代码,再次更改,又需要修改代码,增加了后期维护的难度。
2) 提高团队开发效率
项目开发时常需要将项目分层,由团队成员分别负责一层,项目开始时,发起者还需要为各层设计一个接口,以提高开发效率。为什么呢?
现在项目分层为controller、service、dao,controller需要使用service层的方法,service需要使用dao层的方法。
假若此时没有接口实现分离的方式,也就是说没有发起者设计的那套规范,controller需要等service实现后才能开始写代码,service又需要等dao实现后才能开始写代码。
Service中: ApplicantDaoImpl dao = new ApplicantDaoImpl();
而使用接口后,则可以实现三层代码的同步开发,现service中
3) 封装,隐藏实现细节
一些软件开发商发布项目时只提供api,不提供具体实现(这个没找到具体实例)
④ 个人之前使用接口的困惑。
Q1: 对于不需要频繁更变实现类的方法,是不是就可以不用写接口了?
A1:不是,需要写。
Q2:接口和抽象类怎么区别使用
A2:还没搞清楚
2) Linux
今天继续学习了linux,以下是笔记
1)vi和vim编辑器
编辑普通文件
vim 是 vi 的增强版
三种模式:命令行、插入、底行模式
切换到命令行模式:按Esc按键
切换到插入模式:i、a、o
切换到底行模式::
保存退出::wq
强制退出::q!
2)重定向输出
> :重定向输出,覆盖内容
>> :追加内容
3)管道 | (▲)
将一个命令的输出作为另一个命令的输入
例如:
ifconfig | gref 192.168
含义:
在ifconfig的结果里查看"192.168"所在行的内容
以后常用
查看所有进程
ps -ef
查找和Java相关的进程
ps -ef | grep java
查找和3306相关的信息
ps -ef | grep 3306
4)系统管理命令
date 显示当前时间
date -s "2017-09-05 16:15:45" 设置时间
df 查看磁盘
free 查看内存
clear 清屏
ps -ef 查看所有进程
kill pid 关闭进程
kill -9 pid 强制关闭(▲)
du 显示目录或文件的大小
du -h 显示当前目录的大小
who 显示目前登录系统的用户信息
5)网络管理命令
ifconfig
ifconfig 网卡名称 down :禁用网卡
ifconfig 网卡名称 on :开启网卡
ping ip
netstat -an 查看网络端口
6)用户管理
添加用户:
useradd 用户名 :默认会在home目录下给一个用户创建一个目录
passwd 用户名: 回车输入密码
useradd 用户名 -d /home/目录 :创建一个用户然后再指定该用户的家目录
删除用户:
userdel 用户名 :不删除家目录
userdel -r 用户名 :删除用户连带家目录一起删除
切换用户:
ssh -1 用户名 -p 22 主机
su - 用户名
7)组管理
添加:
groupadd 组名
useradd 用户名 -g 组名
删除:
groupdel 组名
注:若组下有用户就无法删除
8)id, su 命令
id:查看用户的pid与uid
su:切换用户
9)权限管理
普通文件:包括文本文件、数据文件、可执行的二进制程序文件等
目录文件:Linux系统把目录当成是一种特殊的文件
设备文件:Linux系统把每一个设备当成是一个文件
通过ll展示的列表:
以 d 开始的是目录文件
以 - 开始的是普通文件
文件的权限 9个字母 每三个一组:
第一组代表当前用户的权限
第二组代表组的权限
第三组代表其它用户的权限
r:读(4) w:写(2) x:执行(1)
如:
chmod 变更文件的权限:
示例:设置文件a.txt的权限为当前用户:读写执行,组:读执行,其他用户:读执行
chmod 755 a.txt
chmod u=rwx,g=rx,o=rx a.txt
chown 变更文件或目录改文件所属用户和组:
chown ul:public a.txt :变更当前的目录或文件的所属用户和组
chown -R ul:public dir :变更目录中的所有的子目录及文件的所属用户和组
chown 用户:组 文件
3) Java基础——反射
1) 回顾
继续上一篇日报的问题:在不知道一个对象的运行类型的情况下如何将它强转回运行类型从而调用特有的方法。
上文提到字节码对象可以获取类的一切,现在已经获取到了obj的Class对象了。
2) 获取类中的方法
Method[] getMethods():获取类中public修饰的方法
Method[] getDeclaredMethods():获取类中所有的不包含父类的方法
Method getMethod(String name, Class<?>... parameterTypes):获取类中指定的public修饰的方法
Method getDeclaredMethod(String name, Class<?>... parameterTypes): 获取类中指定的任意的不包含父类的方法
现在来解决1)中的问题,getMethod方法获取toLocaleString方法对象后执行。
代码示例:
注:
getMethod(String name, Class<?>... parameterTypes),第一个参数是方法名,之后是一个可变参数数组,传入所获取的方法的参数的Class对象;
invoke方法是Method对象执行方法,需要传入方法所属类的实例,和方法的参数;
getDeclaredMethod(String name, Class<?>... parameterTypes)方法可以获取到私有方法,但执行前必须将方法设置为可访问的,setAccessable(true),否则会抛出异常:
3) 获取类中其它
① 获取构造器
Constructor<?>[] getConstructors() 返回包含一个数组 Constructor对象反射由此表示的类的所有公共构造 类对象
Constructor<?>[] getDeclaredConstructors() 返回一个反映 Constructor对象表示的类声明的所有 Constructor对象的类
Constructor<T> getConstructor(Class<?>... parameterTypes) 返回一个 Constructor对象,该对象反映 Constructor对象表示的类的指定的公共类函数
Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes) 返回一个 Constructor对象,该对象反映 Constructor对象表示的类或接口的指定类函数。
② 获取字段
Field getField(String name
): 返回一个 Field对象,它反映此表示的类或接口的指定公共成员字段类对象
Field[] getFields():返回包含一个数组 Field对象反射由此表示的类或接口的所有可访问的公共字段类对象
二、 明天计划的事情
1) 做深度思考
2) 学习ssm框架
三、 遇到的问题
1)最近没做任务,加上快开学了,有点懈怠,需要自我调整
四、 收获
1)今天再次按照师兄要求的方式做深度思考题,感觉思维拓宽了
评论