楔子
我是一个爱吹牛B喜欢秀优越感的人,啥,你问我有没有mod作品?——做mod是不会做的,这辈子都不会做的,插件又不会写,只能日常吹吹牛写写教程维持一下这样子,mcbbs开发版的人都是大佬,比在知乎上感觉好多了,里面个个都是人才,说话又受里受气,我超喜欢这里的!
好了说正事,在此之前,你应该熟悉一下Java本身——语言和IDE都是工具,重要的是背后的思想,例如算法和数据结构,例如编码与数据分离的理念,例如……
如果不想看书,可以到腾讯课堂/网易云课堂查找视频,或者在知乎搜索“Java”,有不少专业的意见——现在的知乎可以当搜索用了,而且在知乎发文无需审核。
以下是一些便于表达的名词,特此声明,以免麻烦:
类:以“class 类名{}”声明的存在,由一系列方法和变量(又称引用)和对象组成,单独的Java源码文件(Java class文件,扩展名为.java)需要一个,也只能有一个“public class 类名{}”来为类和文件命名,若是声明了多个public class,就会报错。 方法:以“ 返回类型 方法名(参数){返回值 xxx}”声明的存在,又称函数,没错它们就是一个东西。返回类型可以是空的(void)。 对象:你可以将对象视作一个服务的提供者,在Java中,只有new关键字才能声明一个对象(有些方法可以生成一个对象,那是因为它们返回了一个new声明的对象)。 包:一系列类组成的集合,是管理类的重要集合(例如java.util包)。 包管理:又称依赖管理,在实际操作中我们很难仅仅依靠Java本身就做出想要的东西,需要用到很多其他的代码进行依赖,包管理应运而生,它们会帮你管理复杂的依赖项目。 在IDEA中,你可以在代码正文中点击选择包名,类名,方法名进行有意义的操作,由于这些东西都是“声明”出来的,以下将统称这些代码正文中可选的东西为“声明”。 |
引言—什么是JetBrains和IntelliJ IDEA,IDEA相对于Eclipse的优势
JetBrains是一个来自捷克共和国的软件开发公司,主营**为各种语言IDE(集成开发环境),并拥有口碑良好的JVM方言(建立在Java虚拟机上的语言)kotlin。大家喜欢称呼它和它的产品线为“JB桶”,其中最负盛名也是唯一有免费社区版的就是今天要介绍的IntelliJ IDEA,一个适用于Java等语言的IDE。 注:你可以为IDEA加装Python,PHP等插件,以取代同一公司推出的Pycharm,WebStorm,实现一软件多用。 IDEA有两个版本:社区版和旗舰版,社区版开源免费,可以实现日常所需的功能;旗舰版收费,拥有更高级的功能,可参见下图: 左为旗舰版,右为社区版,可以看到,旗舰版多出了查找重复代码,软件配置管理(Perforce),JavaScript/TypeScript(微软开发的JS替代品,属于JS的超集,适合中大型项目)支持,JavaEE和Spring等常见框架支持,SQL等数据库支持。这里是mcbbs,都是MC相关的,按理说不需要JS和框架的支持,一般人用社区版就好。 如果你真的需要做很多事情,例如在做MC开发的时候想用JS/TS做个网站(别问我哪来这么多复杂的需求,你要问mcbbs上哪来这么多少年天才,各种清华北大同济复旦交大985常青藤G8的),那么旗舰版也可以一试。 考虑到mcbbs学生天才遍地走的现状,最适合学生的应该是旗舰版学生授权这种方法——你可以通过此方式获得JB全家桶一年的授权,且可以续期,只要你还能证明你还是学生,无论是用校园邮箱,还是学生证拍照。具体可参见:JetBrains学生授权 如果你想白嫖,请自行百度或者摇人,本贴不传播破解信息。 那么IDEA比起Eclipse自带什么优势呢? 优良的代码分析和代码重构技术; 最好的高版本JDK支持; 拥有优秀的自动补全机制,可大大减少程序员的输入量; 对Scala和Kotlin之类新型的JVM方言拥有最好的支持(废话,Kotlin就他家做的) 自带完善的Maven/Gradle依赖管理; 自动警告机制; …… |
安装与内存调节(这里采取社区版演示,与旗舰版安装没有区别)
现在你已经在官网上下载到了安装程序,准备打开安装。IDEA的安装程序界面是英文的——也没办法,IDE基本都这样,除了VS我就没见过官方自带汉化的IDE,克服一下,不要见到英文就缩卵了。 在这一步选择安装路径,C盘其实就可以,现在的硬盘并不需要考虑“C盘空间不足”这一问题,尤其是固态硬盘。 Create desktop shortcut:创建桌面快捷方式,现在绝大多数的电脑都是64位系统,什么你的是32位?我建议你上MSDN itellyou上下载重装一个系统。 Create Associations:创建关联,.groovy是groovy源码文件格式,.kt是kotlin源码文件格式,建议全选。 Download and install JRE x86 by JetBrains:安装JB自定义的JRE,其实没啥用,不选也罢。 安装完成后,可以点选“Run IntelliJ IDEA”复选框以运行它,反正你迟早也要打开它的。这一步是让玩家从以前安装过的路径中导入设置,有“上一个版本(Previous version)”,“自定义路径(Custom location)”,和“不导入设置(do not import)”,如果你是第一次装,不导入就好了,然后点击OK。 下一步是选择UI风格,点下一步即可。 在这里对你的IDEA所需工具进行自定义,默认是全选的,下一步即可,或者点击Skip直接跳过。 这里是IDEA推荐的一些支持,分别是scala语言的支持(推荐安装),IDEA内置的vim编辑器(如果你熟悉vim的话),和IDE特性提示器(一个有助于使用者了解的小功能,推荐安装)。 然后点击右下角“Start using IntelliJ IDEA”,即可开始使用啦。 如果这是你的第一次(怎么有点羞耻),点击“Create New Project”来建立一个新的工程。注意,IDEA的project是最大的单位,相当于eclipse的workspace,而IDEA project下的module则相当于eclipse workspace下的project——换言之,如果你想方便在一个IDEA窗口内管理你的所有代码,推荐将你的代码分module(模块)存放。 现在,欢迎体验IntelliJ IDEA! 或许你听过一些说法,说IDEA需要8G及以上内存,其实你在4G上一样能用,不过或许需要调节一下其内存用量: 打开IDEA安装路径\bin\idea64.exe.vmoptions(如果你用的是32位,打开的则是idea.exe.vmoptions),可以看到对IDEA的虚拟机设置: 这些都是Java虚拟机参数,其中-xmx代表着分配给IDEA的Java堆大小,翻译成人话就是IDEA能用的最大内存,笔者这里的设置是750M,如有需要可以改大改小。 -xx:……GC是垃圾回收器参数,如果你使用较新的Java,可以尝试使用-xx:+UseG1GC。 其他的选项不再赘述,用户可以在后续的使用中了解这些参数。 |
新建一个工程及注意事项
如上,点击“Create New Project”或者在IDEA的窗口中点击File→New(新建)→Project,弹出如下对话框。 Project SDK:工程开发包,其实就是你的JDK(Java Development Kit,Java开发包)路径。如果你是第一次安装的话,这里是空的,还会有一个“Download JDK”链接,点击进去就是Oracle官方的JDK下载网址,下载之后,点击“New”即可选择JDK所在路径,如果没有JDK你是无法正常编写Java程序的。 Additional libraries and frameworks:适用于使用框架的开发者,如果你不选择其中的任何一个框架,直接点Next,那么将建立一个普通的Java工程(我第一次看蒙了好长时间) Java Enterprise:Java EE开发,适用于企业用户,IDEA旗舰版自带Java EE8。 JBoss:与默认选择Java没有区别,不过一般没人多点一下的。 JavaME:Java移动应用,主要应用于嵌入式设备,用它进行开发需要Mobile JDK。 Clouds:编写PAAS(Platform-as-a-Service,平台即服务)云应用。 Spring:使用Spring框架开发应用,IDEA旗舰版自带。 JavaFX:Oracle做来取代Swing的项目(Swing这个技术已经老旧不堪,就连“拉伸窗口窗口内的按钮跟着变大”这一基础功能,也要自己写算法实现),写GUI的良好选择。注意:该技术将在Java11中被移出JDK,作为独立模块下载。 Android:顾名思义,安卓开发,需要Android SDK和指定设备形式,例如Phone and Tablet(手机和平板开发),Waer(可穿戴设备开发),TV(电视开发)等。 IntelliJ Platform Plugin:IDEA插件开发,IDEA自带其开发包。 Maven/Gradle:使用Maven/Gradle进行包管理。 Minecraft:别想多了,IDEA自己并不支持MC开发,这是一个插件带来的。 Groovy:建立一个Groovy语言工程。 Grails/Application Forge:使用Grails框架,以Groovy语言进行开发。 Scala:建立一个Scala语言工程(Scala可以用来开发MCmod)。 PHP:建立一个PHP语言工程(需要插件支持,PHP是最好的语言!) Kotlin:建立一个Kotlin语言工程(Kotlin也能用来开发MCmod)。 Static Web:Web开发,你可以使用React,Twitter Bootstrap等新框架进行。 Node.js and NPM:使用Nodejs和它自带的包管理工具NPM进行开发。 Flash:使用Flash进行开发——flash其实也是过时的技术了。 Python:需要插件支持,建立一个Python语言工程,可以选择django,GAE等框架进行开发,推荐使用Python 3.x。 Empty Project:空工程,没有任何代码。 选好你所要的项目之后,点击下一步(Next),为你的工程指定名字(默认为untitled,未命名),点击完成(Finish)即可建立新工程——接下来它将是你进行工作的主要区域。 最基础的部分已经结束,接下来将转入IDEA的窗口进行描述。 |
文件管理(File)
这里是File菜单,负责管理文件和设置等IDE基本管理。 New代表新建,可以在其中新建工程或模块,图中的“Project from existing source”意为你可以从其他工具/IDE打包留下的标志性文件中获取到某个已有的代码工程,如图: 如果你用过eclipse,那么会留下.project文件;如果你用过gradle,那么会留下.gradle文件,等等。IDEA会从这些标志性的文件中读取到工程的信息进而为你打开整个工程(也就是说你可以通过打开forge的build.gradle文件来部署forge环境),如果你只选择了含有这些文件的文件夹而不是具体的文件,那么和“Open”直接打开没有区别。 Project from version control:如果你想从公司内网,Github之类有版本控制的地方获取代码,那么这个功能很有必要。 以Git为例,点击“Project from version control”→“Git”,会让你填入从GitHub克隆来的代码库链接,可参考Github初级教程→IDEA对GitHub的支持部分,其他的版本控制恕不赘述。 Module:除了范围比Project小,作为Project的下一级而存在之外,与Project没有其他区别。 Module from existing sources:除了建立的是个module外,与Project from existing sources没有区别。 Directory:新建文件夹,另外只有在被标记(Mark)为“Source Root”的文件夹下,才可以建立Java class(Java源代码文件),包,和其他所有类型的文件。 那么如何将一个普通的文件夹标记为SourceRoot呢,右键该文件夹: 选择“Mark Directory as(将文件夹标记为)”→“Source Root”即可完成标记,注意不能将一个source root的上一级也标记成source root,如果误标记,右击出错的文件夹,选择“Mark Directory as”→“Unmark source root”即可。 默认情况下,建立一个Project/module,就会有一个相应的source root文件夹生成,给你一个写代码的地方。 点击Load/Unload Modules,会弹出一个对话框让你选择加载或卸载哪些模块,这可以节省你的加载时间而不影响你的任何文件。 现在到了写代码的时候,应该新建单个的文件了。 Java class:Java源码文件,你将在这种文件中输入你的源码,它的扩展名是.java。 Kotlin File/class:kotlin源码文件,如果你想写kotlin代码,需要选这种文件,也可以用IDEA自带的功能将Java class转为kotlin文件。 file:文本文件。 Package:如果你有一些相互关联的文件,或者想把文件按目的分开,包是很重要的。你的Java源码中,“package xxx;”语句将是除了注释之外的第一行语句,等同于C#中的命名空间。 Python Package:存放一系列Python源码文件的包。 FXML File:新建一个fxml文件,fxml是一种用xml来表达javafx界面的文件。 其他的新建文件类型都可以直观看出,不再赘述。 Open:从某个路径打开已有的代码工程。 Open URL:打开某个网页查看其源代码,例如你可以把mcbbs的首页地址复制进去。 Open Recent:打开最近使用过的工程。 Close Project:关闭此工程(不关闭窗口)。 Settings:设置,内容极多,需要另开一节。 Project Structure:工程结构,在这里设置JDK,文件结构等事项。 Project SDK:在这里设置你的开发包路径,如果你在安装时忘记设置了的话。 点击“New”可以添加包括JDK,Android SDK在内的开发包。 点击“Edit”可以对当前SDK内的组件进行变更,移除一些你不需要的组件可以加快加载。 这是点击了“edit”之后弹出来的对话框,从左到右分三栏,点左侧栏的左右箭头可以实现后退/前进,点击中间栏的加减号可以实现对开发包的添加或移除(并不删除原文件),右侧栏点击加减号可以为当前开发包增加组件/移除开发包下的某一组件。 Project language level:如果你安装了Java9甚至更高的版本,是不是就不能写旧版的代码了呢?当然不是,这一选项可供调节选择旧版本的Java语言特性,图中展示的“8-lambda……”即为当前选择了Java8语言特性进行开发。 Project compiler output:每一个模块都会有这样的一个目录,源代码编译后的结果将被输出到这个文件夹当中,用户若有需求可以在其中指定。 在Modules这一分页下,你可以管理模块之间的关系。Source选项卡中你可以像刚才一样,指定不同版本的语言特性与每个文件夹的类型(source root,exclude等)。 在编写Java的时候如果需要依赖,我们会用import关键词,但是这只适用于类和包之间,如果是别的模块的话,import就不起作用了——dependencies选项卡这时候就很重要,它可以处理模块和现成jar文件之间的依赖。 点击右侧的绿色加号,会有一个菜单,菜单里有三个选项:“JARs or directories”,“libraries”,“Module dependency”。 第一个选项会让你选择需要的jar包或文件夹,第二个选项会让你选择你需要的前置(library,需要精确到某个文件),第三个选项会让你从当前工程中的模块中选择依赖。选中下方Export区某个library(例如图中的jna-4.4.0jar),可以点击减号移除对它的依赖(前提是你的代码完全不需要它),或者点击上下箭头以改变其加载优先级。 在Libraries分页中你可以将某些重要的第三方库变为library,这样它就可以显示在modules分页中的export区中便于管理。 点击中间栏的绿色加号,可以选择文件夹路径以指定library;在右侧可以对IDEA加载的library内容进行进一步管理。 其他设置不再赘述。 Sync Settings to JetBrains Account:如果你有正常的JB授权(包括社区版),你需要下载JetBrains ToolBox,在里面填入你的JB账号与密码,登录后重启IDE,然后此功能可以将你现在的设置同步到JB账户(Sync是synchronize,同步化的简写) Import settings:从以前安装过IDEA的文件夹中导入设置。 Export settings:将当前的设置导出到某个文件夹中。 Save as Directory-based Format:将其保存为基于目录的形式,这样做将使左侧的文件夹全部消失,你只能通过菜单栏下方的导航栏逐个按路径查看文件,极不推荐。 Save all:保存所有文件,不过这么做一般没用,IDEA是实时保存的。 Power-Save Mode:节能模式,将不允许通知弹窗与后台运行项目。 Exit:退出IDEA。 |
IDEA的窗口部分(Edit)
undo/redo:撤销/恢复,我相信这是很多人在进行编辑工作时最常见的操作了。 cut/copy/paste/delete:剪切/复制/粘贴/删除。 copy path:复制当前所编辑的类的路径,有助于让编辑者和其他人判断。 copy reference:点击声明,并点击此选项,可以复制出该名称所在的路径,例如net.minecraftforge.client.ClientCommandHandler,或java.util.List#toArray(T[])(方法被#号所标记)。 paste from history:点击此项,从你过去的剪切/复制记录中选择某一记录粘贴,手机上也有类似功能。 find:查找与替换,在这里你可以对代码中的内容(除类名之外)搜索或者替换。 例如我们想要查找一个叫leftofcursor的东西,点击find→replace(替换),代码编辑区域上方就会弹出如图所示的编辑栏,在最上面输入“leftofcursor”(你要查找的内容),可以选择“matchcase(匹配大小写)”,“words(单词)”,“regex(正则表达式)”选项进行匹配。(注:你可以在《Java编程思想》一书中找到正则表达式的讲解)。 在较下面的框里输入你要替换的文本,点击“replace”,会替换第一个搜索到的结果,点击“replace all”则会替换所有搜索到的结果,点击“exclude”则会排除某一结果。 Macros:宏(不要认成Marco!),点击Macros→Start Macro Recording,即可打开宏记录器——不要把它当做很高大上的功能,它的作用就是记录使用者的键盘与鼠标操作记录,以简化工作,如果你要对大量的类文件进行相同的操作时,这个功能很有用。 当你记录完你想要的操作时,点击Macros→Stop Macro Recording,就会停止对玩家操作的记录,并弹出一个对话框让你输入这个宏的名字,点击OK即可保存该宏。你可以录制多个宏,当你需要对某一文件执行相同的操作时,点击Macros→Play Saved Macros,会弹出一个菜单让你选择需要使用的宏,点击选择之后就可以重复使用刚才录制的宏了。 Play Back last Macro:回放上一个用过的宏。 Edit Macro:重命名/删除你的宏。 Column Selection Mode:队列选择模式,启用这一选项之后你可以选择一个矩形区域内的内容,光标变得很大,横跨几行。 Select all:全选。 extend/shrink selection:扩选/缩选。 中间几项不再赘述。 Edit as Tables:作为表格编辑,你可以把文件像excel表格一样编辑。 Tab-separated:按制表符(tab)分隔单元格。 comma-separated:按逗号(comma)分隔单元格。 value separator:值分隔符,可选tab,comma,semicolon(分号),newline(回车换行)。 row separator:行分隔符,可选同上。 你可能想在一个窗口中同时编辑多个文件,可以右击文本编辑区上方的类文件名,选择“Split Vertically”(竖直分栏)或“Split Horizontally”(水平分栏),如下图: 其他选项略。 |
查阅必要信息(View)
在View→Tool Windows菜单下你可以控制很多栏(工具栏菜单栏等)的显示和关闭。 Projects:点击这个你可以开启或隐藏左侧project栏,也可以直接点击project栏右侧的最后一个按钮将其隐藏,如下图: Project栏右侧有四个按钮,分别是完全展开(Scroll from source),完全折叠(collapse all),设置显示方式(settings)与隐藏(hide)。 collapse all:将当前的文件夹全部折叠,眼不见心不烦。 scroll from source:如果你折叠文件夹把你现在编辑的文件折叠“丢了”,你可以点击这个直接显示你当前编辑的文件。 settings:project栏的显示效果,没卵用,毕竟我们是来开发的不是没事摆着看的,除非你是个死宅,没事把IDE背景都换成二次元小姐姐。 hide:隐藏project栏,效果与在tool windows菜单中点击project是一样的。project和接下来所有的栏都有这样一个hide按钮,可以直接隐藏。 现在我们回到tool windows菜单当中。 TODO:我们经常会将暂时没有实现的方法打上//todo注释,这会被IDEA识别出来,点击这一项会显示出你当前todo的数量,以及它们在哪儿。 Structure:显示当前类的结构,包括里面的方法和方法返回值,各种变量,对象等,如图: (粉色m打头的是method,黄色f打头的是float数) ant build:ant是一个流程脚本引擎,用于自动化调用程序完成项目的编译,打包,测试等(百度结果),笔者对其了解不足,暂不描述。 ASM:安装了ASM bytecode outline 2017插件才会有的项,用于查看当前类的字节码和按照ASM字节码框架编写的写法。 build:显示此项目的构建结果。 Database,database changes:点击前者以新建和管理一个数据库,后者负责查看数据库的变化,笔者对其了解不足,暂不描述。 documentation:显示当前所有的开发文档。如果你不想患上“看自己代码都不认识”综合征,也不想让别人看你的代码头疼,写个开发文档是个很重要的事情。 event log:查看IDE中的事件日志。 Gradle,Maven Projects:新建,查看和管理由maven/gradle进行依赖管理的工程或模块。 Terminal:在当前工程所在的目录下打开一个命令行,你可以在其中输入命令,例如javap反编译命令。 sbt,sbt shell:sbt是scala标准(不是专用)的项目构建工具,sbt shell则是用于sbt的命令脚本,类似于powershell。 以上所有的功能都可以通过IDEA窗口边缘的快捷按钮调出或隐藏,如图: 现在我们回到View菜单当中。 Quick Definition:如下图,这可以让你在不切出当前类的情况下,快速查看其他类的代码。 show siblings:查看该类型的同胞关系(由哪一个父类继承而来)。 quick documentation:快速为这个类产生一个简洁的文档。 show decompiled class:显示当前类的反编译结果(IDEA自带反编译)。 show bytecode:查看当前类的字节码(IDEA自带功能)。 parameter info:显示参数信息。 expression type:显示选中的表达式类型。 context info:当你处在一个很长的方法中时,点击这一项可以直接在上方看到方法名和参数。 jump to source:跳转至被选中声明的源码。 recent files:点击此项会弹出一个菜单,显示最近打开过的文件。 recently change files:最近修改过的文件。 recent changes:最近的修改。 compare with:点击此项,会弹出一个对话框让你选择文件与当前类进行比较,点击你要进行比较的文件然后OK,就会弹出如下所示的比较窗口: compare file with editor:将compare with功能比较过的两个文件在编辑器中重新比较一次,利于小更改快速编辑。 compare with clipboard:将当前类与剪贴板中的内容(就是你上一次剪切/复制的内容)进行比较。 toolbar:显示/隐藏工具栏,这条栏作用不大,所以默认隐藏。 tool buttons:显示隐藏窗口边缘的快捷按钮(就是tool windows菜单里对应的那些)。 status bar:显示/隐藏窗口最底端的状态栏。 navigation bar:显示/隐藏导航栏。 其他的不再赘述。 |
查阅与跳转(Navigate)
Class:点击此项会弹出一个对话框,输入你要查找的类名,回车即可搜索。 File:搜索文件。 Symbol:搜索类型(例如String)。 line/column:搜索某一行或某一列。 Back/forward:后退/前进到你用过的文件。 Bookmarks(书签):点击bookmarks→toggle bookmarks即可为当前文件添加书签,show bookmarks可以查看你所有的书签,previous/next bookmark可以查看你上一个/下一个书签。 select in:点击此项会出现如下图菜单,用户可以在菜单中选取一些常见操作。 Goto:这可不是那个臭名昭著的goto语句!点击一个声明,然后点击此项,便会显示出所有应用到这个声明的文件(精确到行),如下图: Implementations:对接口使用,查看实现过这个接口的文件。 type declaration:类型说明。 Super Class/Super Method:用以查看类声明的父类或该方法声明所重写(override)的方法。 注:override的特点在于,被重写的方法在方法名和参数上都没有区别,仅仅是多了个修饰符。 Test:测试。 file path:从下到上,分级显示该文件在资源管理器里的路径。 type hierarchy:类型层次结构,点击此项可以查看该类继承于何类,又被什么类继承。(在Java中,一切类都是直接或间接地继承于Object) method hierarchy:方法层次结构,点击此项可查看该方法重写过什么方法,又被什么方法重写。 call hierarchy:调用层次结构,可以查看调用此方法的其他方法,还可以逐级查看,如下图: (通过getCommands方法逐级查看到了对execute方法的调用) Go to previous/next call:查看上一个/下一个调用。 previous/next method:上一个/下一个方法。 |
快捷代码编辑(Code)
Override methods:点击方法声明,会弹出一个对话框让你选择需要被此方法重写的方法。 implement methods:实现某个接口中的方法。 Genarate Delegate:对这个类的成员变量(例如图中的String MOD_ID)生成代理(C#称其为委托,Java原生不支持这种语法,但C#可以)。 Generate:对这个类生成一些常见的要素,如constructor(构造器),getter/setter方法,tostring()方法,eventlistener(事件监听器)等。 Insert live templates:Java开发中存在着很多重复工作,此功能可以向文件中自动输入模板内容,点击即可弹出一个菜单供用户选择需要的模板,如图: 这些模板很多情况下不需要用户手动选择,而是会在用户输入时的自动补全中出现,你可以在设置中添加你自己的模板。 reformat code:格式化代码(与格式化硬盘是两回事),提高可读性。 auto-indent lines:行自动缩进。 optimize imports:如果你import(导入)了些无用的包,或者导入错误,这会帮你清理,但是它不能帮你自动导入(在不修改设置的情况下),只会在用户编写的时候提示用户需要导入。 Show bytecode outline:由ASM插件提供的功能,查看当前类的字节码和ASM写法。(顺带说一句,如果有必要动态生成代码或修改他人代码,类似于MC coremod那样,最好不要用Java自带的反射,应该用Javassist/ASM之类字节码框架) Convert Java File to Kotlin File:将Java文件转为kotlin文件,如果你有转kotlin开发的需求,这功能非常有用。 啥?你问kotlin有什么好处?没有什么好处,辣鸡kotlin。 其他功能不再赘述。 |
分析你的代码(Analyze)
Inspect Codes:分析一定范围内的代码并给出警告(作为一个懒惰的程序猿,警告是什么去他大爷的),如下图: 范围有整个工程(默认),某个模块,单个文件,自定义路径(如果你的这部分代码在版本控制系统里,还会有uncommitted files),分析结果如下: Analyze Stacktrace:分析栈帧。 其他功能不再赘述,顺带说一下,VS的代码分析天下无敌。 |
更好的重构你的代码(Refactor)
Rafactor(重构)菜单下有很多代码重构操作,点击refactor this(this指的是你选中的声明),会弹出一个菜单让你选择重构操作,不同的目标有不同的操作: rename:重命名。 move:将类移动到某个包/方法移动到某个类。 copy:复制当前目标。 safe delete:安全删除。 constant:提取常量,将当前类中的数值变为final修饰的常量,单独显示出来,例如public final constant=xxx; variable:提取变量,将当前类中直接的对象转成变量,例如将return new Class()转成Class class=new Class();return class的形式。 (Class在这里指的是类名,不是类型信息Class,日后可以继续学习) field:提取成员变量,例如return new Class()转成Class class;class=new Class();return class的形式。(我们可以看到,提取成员变量比起提取变量多了一道“手续”)。 这么做并不会显著提升或降低你的代码效率——这不是大学出的C语言题目,一个++--算几步。我们进行重构大多数的目的,就是为了提升可读性和增强扩展性用的,因为你的代码可能有一天由新人接手,也可能扩增需求,这么做是有必要的。 parameter:将某个变量提取成当前方法的参数,方法体内采取this关键字调用这个参数。 delegate:提取出一个委托。 interface:根据这个类所需要的接口和自带的方法给它造出一个接口,适合需要用一个类扩增出多个相似类的情况。 superclass:根据这个类所带的变量和自带的方法给它造出一个父类。 点击“Refactor”→“Extract”→“Method”会弹出一个对话框,输入你想要的方法名,点击OK将变量声明或者你选中的一些内容提取成一个单独的方法。 点击“Extract”→“Parameter Object”可以将方法声明里所有的参数转成一个类,可以选择建立一个新的独立类,一个内部类或者已有的类,原方法里的参数将转为新类的引用,如下图: (只需输入类名就可以了) 点击“Extract”→“Method Object”可以将当前你选中的内容转变为一个内部类(或者匿名类),输入相应的名字即可。(什么样的内容会被这样转换暂时还不明白) 以上均可在“Refactor”→“Extract”菜单里找到。 Inline(内联):相当于Extract的逆操作;如果你觉得你分离出的方法太多,稀碎稀碎的,你可以通过这种方式将它们合并回去——如果你的工资是按代码行数算的就另说。 Find and Replace Code duplicates:查找与替换某一范围(可选整个工程,某个模块,某个类文件或自定义路径)内的重复代码。 Pull Members Up/Down:将某个方法转移到该类的父类/子类。 Use interface when possible:如果可以,将弹出一个对话框让你变更所要实现的抽象类或接口——和抽象类以及一般父类比起来,接口的优点是你可以同时实现多个接口。Spring框架就是大量应用接口的典范,但是也请注意,不要过度使用接口,至少要继承父类构造器或者只使用一些默认实现的时候,不要用接口,否则就会浪费工作量。 Replace Inheritance with Delegation:Java不支持多继承,而且滥用继承可能会违反里氏代换原则(父类能出现的地方子类一定能出现),因此实际**中更推荐用组合而不是继承,这一功能负责将继承转变为组合语法。 在Replace with delegate inheritance from中选择你要替换成代理的父类或者接口(例如图中的net.minecraft.item.Item类),在下方选择你要重新实现的方法,点击refactor,即可开始重构。 Convert Anonymous to Inner:将匿名类转换为内部类。(我还是推荐用lambda表达式) Replace Constructor with Factroy Method/Builder:将构造器转换为工厂方法/构建器(工厂和构建器属于设计模式,读者可以在之后的学习中了解)。 Generify:生成泛型,例如将List list = new LinkedList()重构成List<String> list = new LinkedList<String>()。 Migrate:低版本向高版本迁移,如果你要将古老的Java代码换成新的,这个就很有用。 其他选项不再赘述。 |
编译与构建(Build)
你可以选择“Build Project”,将整个工程全部构建一遍(这可能会花很长时间),构建之后会生成jar文件;也可以选择构建一个模块抑或是重新编译单个的文件。 如果你不想在构建上浪费太长时间,可以点击“Generate Ant Build”使用ant进行构建,如下图: generate multiple/single-file ant build:ant会将构建结果以xml文件形式保存,这一选项可以指定以单个还是多个文件保存。 Build APK:构建APK也即Andriod安装包。 其他选项不再赘述。 |
运行与调试(Run)
写完了项目,总要运行(run)和调试(debug)一下,如果你没有开始运行和调试任何类,只有这些选项可选。 在调试之前,你至少应该运行一次你写过的类,如下图: 选择你要运行的类,点击“Run”→“Run”,即可弹出如上的结果。正下方是运行结果,而右上方的菜单则是可以被debug的类,可以看到,你刚刚运行过的类已经显示在菜单中了。一个类必须有一个public static void main(String...args)方法才能被运行,有些人可能会奇怪,个别类(例如mcmod的主类)没有main方法也可以在IDE中被运行,这是为什么呢?因为它们的前置有着加载类的方法,这些类其实调用的是别的main方法。 然后点击“Run”→“Debug”,会弹出刚才的菜单让你选择要debug的类。当你确定了要调试的类之后,这些选项基本都点亮了——没错,它们都是调试选项。 你也可以点击右上角的绿色甲虫按钮直接调试当前类: 下方就是调试信息,你可以看到类中的变量和调用栈等重要信息。 在进行debug的时候,你经常需要打断点来中止程序,定位错误(如上图)。打断点本身很简单,在行号的后面代码的前面点一下,一个红色圆点就是断点。 不难看出,上图是调试信息控制台的左半部分,从上到下是“运行到下一个断点”,暂停(大项目的构建需要等好一会,卡住就不太好了),停止调试,查看断点,禁用所有断点。 点击“查看断点”,会弹出如下的对话框: 你可以在这里管理你的断点(***.java:29指的是某个类的第29行),debug时你的断点会被打对号。 Enabled:启用或禁用断点。 Suspend:挂起,你可以选择挂起整个类文件,或者某个线程。 Condition:限制当某个条件时(例如变量>300),才进入断点。 Log to Console:显示到控制台的日志,效果如下: 这些是调试过程中常用的按钮,从上到下从左到右分别是: 红色三角形按钮:跳转到程序当前执行到的地方。 向下箭头按钮:Step Over,向下执行一行。 向右下箭头按钮:Step Into,如果下一行有方法被调用,将查看该方法的情况。 红色向右下箭头按钮:Force Step Into,强制进入任何相关的方法和构造器。 向右上箭头按钮:Step Out,跳出当前方法。 有X的按钮:Drop Frame,返回到调用此方法的声明。 有I的按钮:Run to Cursor,跳转到输入光标,如果光标和当前断点之间还有断点,则会跳转到距离光标最近的断点。 计算器形的按钮:Evaluate Expression,计算表达式,可以获得和修改变量值,方法返回值等(见下图)。 绿色加号:点击添加Watch,输入以查看某个你需要的变量。 以上的按钮都可以在“Run”菜单中找到对应的指令,不再赘述。 |
实用开发工具(Tools)
Save File/Project as Template:将当前类文件/工程保存为模板。 Generate JavaDoc:与上面那个快速生成的选项不同,这次是真正的Java文档。 范围还是那几样;你可以选择是否在里面显示方法调用树,导航栏,deprecated等注释。 IDE Scripting Console:在这里你可以跑groovy,kotlin,Javascript语言的脚本,输入即可运行。注意:JS脚本运行需要node.js(我也不知道这是为什么)。 JShell Console:在这里输入JShell脚本以快速测试你的Java代码,该功能只适用于Java 9以上版本。 Capture Memory Snapshot:生成当前Java堆所占用内存的一个快照,不过我更推荐使用visualvm工具。 Vim Emulator:点击可启用Vim编辑器,适合喜欢用vim的程序员。 Deployment:从远程服务器部署你的代码到本机,也可以反过来。 点击“Tools”→“Deployment”→“Configration”,即可打开配置界面添加服务器。 点击加号添加,会弹出一个对话框让你填入服务器名和连接方式(Type),支持FTP,FTPS(SSL加密的FTP),STFP(SSH加密的FTP),本地路径等,这些东西可以在上图的对话框中设置与修改。上图最上面四个按钮分别是添加,移除,复制服务器配置和设定默认服务器。 可能有人会问,本地路径也可以?如果你在用局域网,映射了一个网络驱动器,又或是有微软Onedrive/电信天翼云/自己工作场所等的同步盘,那么本地路径还是很有价值的。 FTP Host,Port,Root Path:FTP服务器地址,端口(默认21),root文件夹路径(一般的linux服务器root文件夹路径是给定的,文件也会默认上传到那里,因此可以用autodetect自动指定),再下面是用户名和密码。 Browse files on server:在web server root URL中输入服务器地址,即可浏览服务器文件。 Mappings标签下可以指定本地所要部署的工程和远程服务器上部署代码的位置。 服务器设置完成后,在Deployment菜单下,点击Upload to (Default Server)/Download from(Default Server)可以从默认或指定的服务器上传/下载你的文件。 Compare Local File with Deployment Version:将本地文件和部署到服务器上的版本进行比对。 Sync with Deploy to:将本地文件同步到服务器上的版本。 回到Tools菜单中。 HTTP Cilent:HTTP客户端(直译),进行HTTP请求相关工作。 Groovy Console:Groovy脚本控制台。 V8 profiling:node.js是建构于Chrome V8引擎上的,所以如果你用过V8 profiler对node.js进行过调优,这个profiling选项可以帮你分析调优后的日志。 Generate Scala Doc:生成scala文档。 Kotlin:对Kotlin代码进行编辑。点击“Kotlin”→“Decompile Kotlin to Java”可以将kotlin代码反编译回Java。 Open CProfile Snapshot:CProfile是一个Python程序性能探查器,点击此可以看到当前性能的一个快照。 其他选项不再赘述。 |
VCS部分暂不叙述(已有Github初级教程),Windows和Help部分不讲。
IDEA的部分设置(File→Settings)
我们或许会对IDEA进行一些设置,这时请点击File→Settings,打开设置对话框: Appearence:显示效果,你可以在这里调整显示主题(Darcula即为我现在所用的黑色主题),字体等。 Override default fonts by:选中该复选框,你可以改变默认字体。 Automatically position mouse cursor on default button:自动将鼠标指向默认按钮。 Show memory indicator:在右下角显示一个内存占用条,点击此条可以回收一些内存。 Menus and ToolBars:在这里配置如何显示菜单栏和菜单里的选项,点击选项前面的三角形可以管理其子菜单。 Add After:在选中项后面添加新的选项。 Add Separator:如果你觉得有些选项应该分开显示,可为其添加分隔线。 Remove:移除,不显示在菜单中。 Move Up/Down:向上或向下移动。 System Settings→HTTP Proxy:如果你的IDEA用到了代理服务器,可以在这里填入服务器地址。 Auto-detect proxy settings:在这里填入相应的链接,它会自动为你选择代理服务器。 Manual proxy configuration:手动填入服务器地址。 从图上可以看出,如果你使用了shadowsocks服务器,只需填入127.0.0.1和本地端口1080即可,也可以选择Auto-detect选项自动获取。 System Settings→Android SDK:在这里指定你的Android SDK路径以及开发工具,如何更新。 Notifications:配置各种事件的通知方式,例如Balloon(气泡)。 Path Variables:环境变量。 KeyMap:在这里配置你所有的快捷键。 点击你要调整快捷键的选项(也即IDE中的各种指令),然后点击上面的绿色铅笔按钮,会弹出菜单让你选择“Add KeyBoard ShortCut”(添加快捷键),“Add Mouse Shortcut”(添加鼠标动作,可以配合Ctrl,Shift,Alt使用),“Add abbreviation”(添加缩写)。我们一般关注快捷键,姑且点击添加快捷键,便会弹出上图所示的对话框。 按下你想设置的快捷键,点击OK即可,如果有冲突,对话框会有提醒,告知你该快捷键已经被别的指令使用。 Editor:在这里更改编辑器的行为。 Editor→General→Code Completion:这里是代码自动补全的设置项。 Case sensitive completion:IDEA默认只有首字母大写(First letter)时才会弹出自动补全,将其设置为none可以取消这一限制。 Auto-display code completion:自动补全选项,IDEA的得意功能,如果你取消这一项,只能按Ctrl+Shift+空格快捷键进行自动补全。 Insert selected variant by typing dot,space.etc:当你打下(.)或者空格之类具有分隔作用的符号时,将自动选择自动补全菜单里的第一项。 Editor→General→Auto import:自动导入相关设置。 Insert imports on paste:粘贴复制过来的代码时,如果导入了别的包,默认将会询问,将其设置为All就不会询问了。 Add unambiguous imports on the fly:无需按alt+enter,会自动为你导入包,前提是没有重复的包名,否则你还是要手动指定的。 Optimize imports on the fly(for current project):为当前工程自动清理掉不需要导入的包。 点击Editor→General→Editor Tabs,取消勾选“Show tabs in single row”,可以将当前打开的文件按多行排列,便于寻找。 Plugins:在这里安装,查看和卸载IDEA的各种插件。点击插件名,再点击复选框可以开启或禁用。 Install JetBrains plugin:点击以安装JB官方出品的插件。 Browse repositories:浏览所有插件,如果是外来的插件(非官方),你可以在对话框右侧点击uninstall删除它。 Install plugin from disk:从本地路径安装插件。 Build→Compiler:IDEA编译相关的设置。 如果你觉得构建的速度太慢了,可以用Build process heap size单独为构建进程设置内存,我这里是700,可以继续改大。 Editor→Live Templates:在这里管理你的代码模板。 点击右侧加号,会弹出两个选项:Live Template和Template Group,前者会让你在当前选中的分组(例如Android,如果你没选分组会弹出红色的define字样,让你选一个)下新建一个代码模板,后者会让你直接新建一个分组(例如Java),然后你就可以在对话框中指定abbreviation(模板缩写名)并输入你写好的模板,OK保存。 |
插件推荐
Lombok plugin:通过@getter 和@setter ,@delegate等注解,减少样板代码,提高工作效率。 ASM bytecode outline:将当前的类代码以ASM或groovy的形式显示出来,帮助用户了解基于ASM或groovy修改字节码的流程。 Material UI:提供比idea原版更美观的界面效果,墙裂推荐。 Alibaba Java Coding Guidelines:阿里编程规范p3c的插件,提高可读性的同时更加接近现实**,p3c作者孤尽的另一本书《码出高效》是不错的Java入门书籍。 Stackoverflow:选中一段你看不懂的代码,右击选择search stackoverflow,就可以直接在Stack Overflow上查找。 GsonFormat,Json to kotlin class:从json文件直接生成Java类文件,kotlin类文件。 JRebel:热部署插件,免去重新运行程序重新构建的麻烦(收费)。 …… |
到这里,这篇教程就基本上完工了,如有需要,我还会继续补充。
写在最后的一些吐槽
现在的输入法已经可以直接打出λ了,用“传参表达式”也可以啊,为什么还要用lambda这种不直观的形式? 如果你想存图,记得选择大而稳定的服务器,可靠云用实际证明,它并不可靠。 除非必要,把语言和某个固定IDE绑在一起的教程都是渣渣。 习惯是一个很可怕的力量,而玩电脑的最好经常用些新东西。 没有不适合新手的IDE,只有不适合IDE的新手。 IDEA其实是有汉化的,参见这里。 试玉要烧三日满,编程须待七年期,我说十年开发路,别想今学了明富。 如果你觉得一个东西还不错,介绍给大家,独乐乐不如众乐乐。 我是幼女。 |
[groupid=128]HAYO Studio[/groupid]