文章目录
1. Live Template(实时模板的使用)
在IDEA中有,可以创建实时模板,并且可以实时生效的,这里可以在设置中进行模板的设置,比如在IDEA中并没有关于main
的提示,这里我们通常希望在输入main
关键字的时候,系统可以自动给出提示,按回车后,自动帮我补全,并且光标停留在大括号内:
如上所述,在键入main
后会出现上面的提示,此时回车便可出现下面的模板
public static void main(String[] args) {
//光标停留处
}
方法: Ctrl+Alt+S打开设置,找到Live Template栏目,然后添加Template Group,名字可以自定义,在该分组内添加Live Template,然后填写如下的属性即可:
Abbreviation就是前缀,这里我们填写main
,在输入这个前缀的时候,系统将会自动出现Description处的内容,此后最重要的一步就是填写模板:Template text,这里面的内容就是最终回车之后的内容,里面的$END$
表示的是回车后,光标最终停留的位置,这里将它放在大括号中,最后有一点需要注意的是定义模板语言类型,即最下方的Define,我们勾选java
即可,然后保存即可生效。
下面还有两个实用的模板:上述关于main
的模板应该是比较多的。
示例1:比如将前缀定义为psfi
,模板定义为:
public static final int $var1$ = $var2$;
其余的操作步骤都一样,这个模板的作用在键入psfi
后回车,就会出现上述模板,并且光标停留在$var1$
处,在写完var1变量后回车光标会自动跳到$var2$
处。
示例2:注释模板,在很多时候,定义变量的时候要,加注释,如:
/**
* 姓名
*/
private String name;
这样的代码在实体类中可能会非常多,而且发现这一块都是重复的:
/**
*
*/
private String ;
此时可以定义一个为ps
的前缀:
/**
* $VAR1$
*/
private String $VAR2$;
$END$
在键入ps
后回车,光标停留在$var1$
注释处,在写完var1变量后回车光标会自动跳到$var2$
处,写好变量名后回车,光标定位到后下一行$END$
处。相似运用很多,可以活学活用。
2. 内置后缀 postfix
这里其实就是IDEA提供的一些简写,可以 Ctrl+Alt+S 调出设置,找到 Postfix Completion 或者直接 Ctrl+Shift+A 搜索 postfix,双击打开即可,可以看到java
中关于for循环的写法提供了fori
的写法:
这里面有很多缩写,可以看看,至于为什么叫 postfix,可能是因为这些缩写一般都是跟在一个实例后面像调用方法的方式使用的,类似于A.postfix
。常用的有:
2.1 fori循环
通过栗子可以发现当我使用var.fori
的时候会自动创建一个关于i的循环,从0开始,到var结束:
for(int i=0; i<var; i++) {
//光标停留处
}
上面的代码在IDEA中只需要键入var.fori
回车即可实现,同样的用var.forr
可以产生逆序循环(即i从var开始依次递减循环)。
2.2 sout输出
我们平时使用的sout
输出快捷键也是属于postfix的范畴,除了单纯的使用sout
来产生System.out.println()
外,还可以使用var.sout
回车后就是System.out.println(var)
;
2.3 field补齐追加属性
还有就是filed,有时候写构造函数的时候比如User,需要用到一个属性为name,但是User中并没有定义name,这个时候可以直接:
public User(String name) {
name.field
}
然后回车将会自动补全为this.name = name
,并且在User类中创建name属性private final String name;
2.4 判断是否为null
可以直接使用var.nn
回车即可,将会自动变为
if(var!=null) {
}
3. 强大的Alt+Enter
在不知道如何完成代码的时候可以使用这个组合键,功能比较全面,比如下面的几个:
- 自动创建函数,比如在调用某个函数的时候发现没有这个函数,那么在鼠标定位到调用处,使用这个组合键将会给出创建该函数的提示。
- 简化代码,有时代码习惯性的写法并不是最简洁的,比如最常见的数组遍历,在写好后,光标定位到循环处使用组合键可以简化这个遍历的代码量。
- 实现接口或者创建测试类,在定义好了接口后,可以将光标移到接口名后面使用该组合键,可以得到创建实现该接口类和测试类的提示。
- 导包,在使用某个类的时候没有导入,可以将光标定位到这个类的引用处,使用该组合键即可。
- 英文语法检测,在类中某个单词拼错后,IDEA会在下面提示波浪号表是可能拼写有错误,这个时候使用该组合键,可以选中Rename项查看建议单词,比如下面的applicaion:
选中rename项后,可以查看它给出来了我可能想写的单词如下,选择即可:
4. 重构
4.1 重构变量名
在某个类中,需要对这类中的某个变量名重命名,由于这个属性的名称在很多地方都有引用,可能在本类中和其他类中都有引用,这里可以将光标定位到任意一个引用该变量名的引用处,使用Shift+Alt+R的组合键进行重构,或者使用菜单栏中的Refactor选项。
4.2 重构方法
在某个类中对某一个方法进行重构,大部分是签名的重构,光标定位到方法名上,快捷键为 Shift+Alt+C,然后添加参数类型、参数名、参数默认值即可重构,也可以通过Refactor中的Change Signature来完成该步骤,还可以通过在函数调用的地方使用Alt+Enter的组合键按照提示进行重构。
5. 抽取
5.1 抽取变量
这里的抽取是指抽取较长的变量为了便于阅读,比如
System.out.println("ad" + 20 + "ghj");
然后发现"ad" + 20 + "ghj"
这个东西比较长,我想直接在外面定义一个var将它赋值为那一长串的东西,那么可以鼠标选中这个东西,使用Refactor中的Extract功能,抽取Variable,或者快捷键 Shift+Alt+L 也行。当然这只是抽取去一个普通变量,也可以抽取为一个成员变量或者静态常量,详见Refactor中的Extract中的选项。
5.2 抽取方法
有时,某个方法里面写了很多逻辑,整理的时候可以将这个逻辑都分门别类的单独领出来作为一个单独的方法,提高代码的复用性,这时可以将方法抽取成多个方法的组合,快捷键 Shift+Alt+M,或者使用Extract中method项,填写方法名即可。
5.3 包裹方法
使用块代码(if-else
、try-catch
等等)包裹选中代码片:Ctrl+Alt+T;
6. git 轨迹跟踪
在团队项目中,可能存在某一句代码看不懂,在集成git中,可以通过在该行代码的行号后面右击,选中Annotate即可看到代码作者。另外在IDEA中就算没有使用版本控制工具,他也提供了本地的版本记录信息,这一点很实用,在Local History中。
7. 关联
在IDEA中与Spring的关联,可以通过在自动关联,关联后会发现行号后面出现很多Spring的标志,这些标志可以看到具体的情况,手动关联就需要在Project Structure中为对应的Module添加Spring关联即可(File–>Project Structure–>Facets添加Spring到指定的Moudle即可),除此之外还可以和数据库进行关联,这样在很大程度上减少字段名的拼写错误,方法,在IDEA的侧边菜单栏新建DataSource,选择相应的数据库类型然后填写详细的连接信息即可。
8.调式
打断点,可以直接在行号后面左击即可,或者鼠标定位到这一行按 Ctrl+Shit+B,取消也是同样的操作,然后单步运行(点击Debug或者Alt+Shift+D),每次按F6依次执行下面的每一行(step over),直到程序结束,如果想直接跳到下一个断点可以按F8(resum),停止调式是Ctrl+F2,可能在调试的时候,第二个断点的时候就已经发现BUG了,那么后面的断点就没有必要再运行,这个时候可以禁用断点,点击断点那里的Mute BreakPoints即可,然后F8,由于后面没有断点了,所以程序会一直跑到底,还有一种断点是条件断点(即只有在满足一定条件时,这个断点才会生效),在打完断点后,右击红色断点标志即可输入条件(或者Ctrl+Shfit+F8),这里注意条件的写法是一个标准的java表达式,比如下面的这个条件断点:
另外还有表达式求值,在调试断点的时候,可能需要查看某一个表达式的值,利用Ctrl+U的组合键,然后输入所需要的东西回车即可,比如对于数组arr而言,可以是一个数组(arr),也可以是计算数组的长度(arr.length),数组中的某个元素(arr[1]),都是标准的java表达式。还有就是运行到指定行,但是这一行没有打断点,可以执行运行到光标所在行Run to Cursor(Ctrl+R),另外在调式过程中可以进行设值(只是调试的时候进行设置,对源程序没有影响),比如将下面调试时ab的值改为50,在Variable中选中ab,然后按F2即可设置新值,这个新值将对后面的代码产生影响,这里输出就是50了,而不是ad20ghj:
8.2 远程断点调式
【附录】
通常在生产过程中打包后将jar包上传到Linux上运行,可以通过shell脚本来重启应用,附实际使用的脚本模板一份:
#!/bin/bash
# 应用端口号(可更改)
JAR_PORT="8081"
# 远程调式端口号(可更改)
MANAGER_PORT="19090"
# 应用jar包的名字(根据实际修改)
APP_PROC="apollo.jar"
WAIT_SECONDS=90
stop() {
# 日志打印,可修改为对应的应用名字
echo 'Stopping apollo ...'
if `ps -ef | grep -v grep | grep -qi "$APP_PROC"`; then
i=0
while (( i < $WAIT_SECONDS ));
do
if ! `netstat -npl | grep -qi ":$JAR_PORT"` && ! `netstat -npl | grep -qi "$MANAGER_PORT"`; then
break
fi
for proc_num in `ps -ef | grep "$APP_PROC" | grep -v 'grep' | awk '{print $2}'`; do
echo "kill $proc_num"
kill "$proc_num"
done
sleep 1
let "i += 1"
done
for i in `ps -ef | grep "$APP_PROC" | grep -v 'grep' | awk '{print $2}'`; do
echo "kill -9 $i"
kill -9 "$i"
done
else
return
fi
if `netstat -npl | grep -qi ":$JAR_PORT"`; then
echo "Kill port: $JAR_PORT"
fuser -k -n tcp $JAR_PORT
fi
if `netstat -npl | grep -qi $MANAGER_PORT`; then
echo "Kill port: $MANAGER_PORT"
fuser -k -n tcp $MANAGER_PORT
fi
sleep 2
}
start() {
if `netstat -npl | grep -qi ":$JAR_PORT"`; then
echo "Exist port: $JAR_PORT, exit!"
exit 1
fi
if `netstat -npl | grep -qi $MANAGER_PORT`; then
echo "Exist port: $MANAGER_PORT, exit!"
exit 1
fi
# 日志打印,可修改为对应的应用名字
echo 'Starting apollo ...'
APP_USER="root"
# 指定jar包的位置,上传的jar放到此处
CUR_DIRR="/data/service/apollo"
CLASSPATH="$CUR_DIRR:$CUR_DIRR/$APP_PROC"
LOG_HOME="/data/logs/paas"
JAVA_OPTS="-server -Xms1024m -Xmx1024m -XX:MaxNewSize=512M -XX:+DisableExplicitGC -XX:+UseParNewGC -XX:+UseConcMarkSweepGC"
JPDA_OPTS="-agentlib:jdwp=transport=dt_socket,address=$MANAGER_PORT,server=y,suspend=n"
echo "java -cp $CLASSPATH $JPDA_OPTS -Dspring.profiles.active=test -jar $JAVA_OPTS $CUR_DIRR/$APP_PROC"
chown -R $APP_USER:$APP_USER $LOG_HOME
# 后台启动应用,指定Spring的配置文件为测试环境的配置,并指定日志文件为/data/service/apollo/apollo.stdout(跟据实际情况做更改)
su - $APP_USER -c "nohup /usr/local/jdk1.8/bin/java -cp $CLASSPATH $JPDA_OPTS -Dspring.profiles.active=test -jar $JAVA_OPTS $CUR_DIRR/$APP_PROC >$CUR_DIRR/apollo.stdout 2>&1 &"
}
case $1 in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
*)
# Print help
echo "Usage: $0 {start|stop|restart}"
exit 1
;;
esac
exit 0
9. 文件操作
- 批量复制:多次在复制不同地方的内容进行组合粘贴,先将需要的内容全部正常复制,然后调出剪切板(记录了近期所有的复制内容)Ctrl+Shfit+V,最后可以进行批量粘贴。
- 快速复制当前行到下一行:Ctrl+Alt+向下方向键;
- 全局查找:Ctrl+h;
- 复制某个类的路径在电脑磁盘的路径:Ctrl + Shfit + C;
- 复制某个类的全类名:Ctrl + Shfit + Alt + C;
- 快速查找某个类文件:Ctrl + Shift + T;
10. Service层注入Mapper报错
IDEA在Service层注入Mapper报错,可以安装MyBatis Pugin插件辅助IDEA进行识别进行解决(不推荐破解IDA的自动检测Bean注入的方式);
11. 类图放大镜
在查看类的继承结构图时,如果类的继承关系很复杂,无法看清类名,可以按着Alt键移动鼠标到类名上就会出现放大镜的功能。