1.利用idea反编译jar成java
2.用了这么久 IDEA,源码你竟然不知道有个功能叫自动补全!源码
3.IDEA骚操作:一键生成方法的源码序列图
4.用好这个IDEA插件,写代码效率至少提升5倍!源码
5.IDEA 自带的源码反编译工具
6.教你如何用 IDEA 反编译 jar 源码解读
利用idea反编译jar成java
要利用IntelliJ IDEA反编译.jar文件为Java源代码,首先,源码dbcp源码修改找到idea中已安装的源码java-decompiler.jar文件路径,通常位于:
D:\app\JetBrains\IntelliJ IDEA .2.2\plugins\java-decompiler\lib\java-decompiler.jar
然后,源码将待反编译的源码.jar文件放置在指定目录,例如 D:\tmp\class_to_java,源码并在该目录下创建一个新子目录,源码例如命名为"XXX"。源码
接下来,源码切换到新目录 D:\tmp\class_to_java,源码执行以下命令以反编译jar文件:
java -cp "D:\app\JetBrains\IntelliJ IDEA .2.2\plugins\java-decompiler\lib\java-decompiler.jar" org.jetbrains.java.decompiler.main.decompiler.ConsoleDecompiler -dgs=true XXX.jar XXX
运行该命令后,源码新的Java源代码文件将以jar包形式在同目录中生成。
用了这么久 IDEA,你竟然不知道有个功能叫自动补全!
IDEA 隐藏着一个强大功能,即后缀补全,许多开发者竟不知其妙用,仍手动敲代码。此功能通过代码补全实现模板式补全,如遍历循环(for、foreach)、冠军直播源码String.format()字符串包裹、类型转化表达式包裹、根据条件生成 if 语句、使用 instanceOf 生成分支判断语句等。 使用方法简单,只需在表达式后输入点号 .,接着输入提示或选择候选,常见候选配有 GIF 动画示例。操作如下:var 声明
null 判空
notnull 判非空
nn 判非空
for 遍历
fori 带索引的遍历
not 取反
if 条件判断
cast 强转
return 返回值
通过这一功能,开发者可大大提升编码效率,减少错误,实现更高效编程。了解更多知识,欢迎关注微信号(ID:芋道源码),获取Java源码解析、原理讲解、面试题、学习指南。回复书籍可获取本Java从入门到架构推荐书籍,技术群则可加入Java、后端、架构专业讨论群。快来提升技能,加入编程大家庭吧!启动页面源码IDEA骚操作:一键生成方法的序列图
在日常学习和工作中,面对代码阅读成为常见场景,无论是阅读他人的代码、框架源码还是回顾自己久远的编写,代码的理解与分析占据了大部分时间。为了解决这一问题,IDEA提供了一个叫做SequenceDiagram的插件,帮助我们一键生成序列图,以直观清晰地展示对象之间的调用关系。
序列图(Sequence Diagram),也称为循序图,是一种UML行为图,用于表示系统执行特定方法或操作(如登录)时,对象之间的顺序调用关系。通过序列图,我们可以清晰地理解对象间的调用流程,如在微信支付流程中,描述了顾客、商家等角色在支付场景下的顺序调用关系,或是HTTP框架中调用InterceptorFactory类的loadInterceptors方法时的类间调用关系。
序列图的描述可以直观地展示类与方法之间的调用流程,适用于阅读源码、技术文档编写、梳理业务流程等场景。juce源码分析在阅读源码时,序列图帮助我们理解调用目标方法涉及的类的调用关系,尤其在代码调用层级较多时,对理解源码大有裨益。在编写项目介绍文档时,根据核心方法生成序列图,可以清晰展示类之间的调用关系,便于他人理解代码逻辑。对于业务流程复杂的系统,序列图将关键角色和对象之间的关系可视化,提供更直观的业务流程概览。
如何使用IDEA根据类中方法生成序列图?通过SequenceDiagram插件,一键即可生成序列图,且具备一系列功能,如点击类/方法跳转到对应位置、删除类或方法、导出PNG等。在插件市场直接查找安装,或通过官网手动下载安装。选中方法名(注意不要选类名),点击鼠标右键选择Sequence Diagram选项。配置参数如调用深度后点击OK,即可生成序列图。通过生成的热点传送源码序列图定位相关代码,尤其在阅读源码时极为实用。完成序列图生成后,还能将其导出为。
用好这个IDEA插件,写代码效率至少提升5倍!
还在编写无聊枯燥又难以维护的POJO吗?洁癖者的春天在哪里?请看Lombok!在过往的Java项目中,充斥着太多不友好的代码:POJO的getter/setter/toString;异常处理;I/O流的关闭操作等等,这些样板代码既没有技术含量,又影响着代码的美观,Lombok应运而生。
首先说明一下:任何技术的出现都是为了解决某一类问题的,如果在此基础上再建立奇技*巧,不如回归Java本身。应该保持合理使用而不滥用。
Lombok的使用非常简单,下面我们一起来看下:
1)引入相应的maven包:
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1..</version><scope>provided</scope></dependency>Lombok的scope=provided,说明它只在编译阶段生效,不需要打入包中。事实正是如此,Lombok在编译期将带Lombok注解的Java文件正确编译为完整的Class文件。
2)添加IDE工具对Lombok的支持:
IDEA中引入Lombok支持如下:
点击File--Settings设置界面,安装Lombok插件:
点击File--Settings设置界面,开启AnnocationProcessors:
开启该项是为了让Lombok注解在编译阶段起到作用。
Eclipse的Lombok插件安装可以自行百度,也比较简单,值得一提的是,由于Eclipse内置的编译器不是Oraclejavac,而是eclipse自己实现的EclipseCompilerforJava(ECJ).要让ECJ支持Lombok,需要在eclipse.ini配置文件中添加如下两项内容:
-Xbootclasspath/a:[lombok.jar所在路径]
-javaagent:[lombok.jar所在路径]
3)Lombok实现原理:
自从Java6起,javac就支持“JSRPluggableAnnotationProcessingAPI”规范,只要程序实现了该API,就能在javac运行的时候得到调用。
Lombok就是一个实现了"JSRAPI"的程序。在使用javac的过程中,它产生作用的具体流程如下:
javac对源代码进行分析,生成一棵抽象语法树(AST)
javac编译过程中调用实现了JSR的Lombok程序
此时Lombok就对第一步骤得到的AST进行处理,找到Lombok注解所在类对应的语法树(AST),然后修改该语法树(AST),增加Lombok注解定义的相应树节点
javac使用修改后的抽象语法树(AST)生成字节码文件
4)Lombok注解的使用:
POJO类常用注解:
@Getter/@Setter:作用类上,生成所有成员变量的getter/setter方法;作用于成员变量上,生成该成员变量的getter/setter方法。可以设定访问权限及是否懒加载等。
packagecom.trace;importlombok.AccessLevel;importlombok.Getter;importlombok.Setter;/***CreatedbyTraceon/5/.<br/>*DESC:测试类*/@SuppressWarnings("unused")publicclassTestClass{ publicstaticvoidmain(String[]args){ }@Getter(value=AccessLevel.PUBLIC)@Setter(value=AccessLevel.PUBLIC)publicstaticclassPerson{ privateStringname;privateintage;privatebooleanfriendly;}publicstaticclassAnimal{ privateStringname;privateintage;@Getter@Setterprivatebooleanfunny;}}在Structure视图中,可以看到已经生成了getter/setter等方法:
编译后的代码如下:[这也是传统Java编程需要编写的样板代码]
////Sourcecoderecreatedfroma.classfilebyIntelliJIDEA//(poweredbyFernflowerdecompiler)//packagecom.trace;publicclassTestClass{ publicTestClass(){ }publicstaticvoidmain(String[]args){ }publicstaticclassAnimal{ privateStringname;privateintage;privatebooleanfunny;publicAnimal(){ }publicbooleanisFunny(){ returnthis.funny;}publicvoidsetFunny(booleanfunny){ this.funny=funny;}}publicstaticclassPerson{ privateStringname;privateintage;privatebooleanfriendly;publicPerson(){ }publicStringgetName(){ returnthis.name;}publicintgetAge(){ returnthis.age;}publicbooleanisFriendly(){ returnthis.friendly;}publicvoidsetName(Stringname){ this.name=name;}publicvoidsetAge(intage){ this.age=age;}publicvoidsetFriendly(booleanfriendly){ this.friendly=friendly;}}}@ToString:作用于类,覆盖默认的toString()方法,可以通过of属性限定显示某些字段,通过exclude属性排除某些字段。
@EqualsAndHashCode:作用于类,覆盖默认的equals和hashCode
@NonNull:主要作用于成员变量和参数中,标识不能为空,否则抛出空指针异常。
@NoArgsConstructor,@RequiredArgsConstructor,@AllArgsConstructor:作用于类上,用于生成构造函数。有staticName、access等属性。
staticName属性一旦设定,将采用静态方法的方式生成实例,access属性可以限定访问权限。
@NoArgsConstructor:生成无参构造器;
@RequiredArgsConstructor:生成包含final和@NonNull注解的成员变量的构造器;
@AllArgsConstructor:生成全参构造器。
编译后结果:
publicstaticclassPerson{ @NonNullprivateStringname;privateintage;privatebooleanfriendly;publicStringtoString(){ return"TestClass.Person(name="+this.getName()+",age="+this.getAge()+")";}@NonNullpublicStringgetName(){ returnthis.name;}publicintgetAge(){ returnthis.age;}publicbooleanisFriendly(){ returnthis.friendly;}publicvoidsetName(@NonNullStringname){ if(name==null){ thrownewNullPointerException("name");}else{ this.name=name;}}publicvoidsetAge(intage){ this.age=age;}publicvoidsetFriendly(booleanfriendly){ this.friendly=friendly;}privatePerson(){ }privatestaticTestClass.Personof(){ returnnewTestClass.Person();}@ConstructorProperties({ "name"})Person(@NonNullStringname){ if(name==null){ thrownewNullPointerException("name");}else{ this.name=name;}}@ConstructorProperties({ "name","age","friendly"})publicPerson(@NonNullStringname,intage,booleanfriendly){ if(name==null){ thrownewNullPointerException("name");}else{ this.name=name;this.age=age;this.friendly=friendly;}}}@Data:作用于类上,是以下注解的集合:@ToString@EqualsAndHashCode@Getter@Setter@RequiredArgsConstructor
@Builder:作用于类上,将类转变为建造者模式
@Log:作用于类上,生成日志变量。针对不同的日志实现产品,有不同的注解:
其他重要注解:
@Cleanup:自动关闭资源,针对实现了java.io.Closeable接口的对象有效,如:典型的IO流对象
编译后结果如下:
是不是简洁了太多。
@SneakyThrows:可以对受检异常进行捕捉并抛出,可以改写上述的main方法如下:
@Synchronized:作用于方法级别,可以替换synchronize关键字或lock锁,用处不大。
作者:LiWenD正在掘金
IDEA 自带的反编译工具
IDEA的内置工具——Java Bytecode Decompiler,无论社区版还是专业版,都能为你提供反编译的支持。核心的java-decompiler.jar文件,隐藏在IDEA安装目录下的/plugins/java-decompiler/lib/路径中。这个工具背后是Fernflower的反编译技术,其源代码可以在github.com/JetBrains找到。
要使用这个工具,首先确保java-decompiler.jar文件在工作目录中。基本操作方法如下:
- 选项[-=]*,*可以表示0、1个或多个,具体选项请查阅源码,如0表示关闭,1表示开启。
- 源文件[]+,可以是.class、.jar或目录,带-e的源文件表示依赖,有助于分析代码关系。
- 目标目录,用于存放反编译结果,只能有一个。
举个例子,你可以执行以下命令反编译单个.class文件:`java-decompiler -o d:/decompiled d:/my.class`,这将把d:/my.class反编译成my.java,存放在d:/decompiled。
对于.jar文件,如`java-decompiler -o d:/decompiled d:/my.jar`,会生成一个新的my.jar,内部是.java格式的源码,而非.class。为了查看源码,通常先解压反编译后的my.jar。
如果要反编译一个目录,用`java-decompiler -o d:/decompiled d:/my`,这会在d:/decompiled中生成一个名为my的新目录。
在处理.jar文件时,推荐先将其解压为目录,再进行反编译操作。IDEA自带的Java Bytecode Decompiler为开发者提供了强大的反编译功能,方便在需要时查看和理解代码结构。
教你如何用 IDEA 反编译 jar 源码解读
要快速查看并解读 jar 包中的 class 源码,使用 IntelliJ IDEA (简称 IDEA) 是一个高效便捷的选择。只需几步操作,就能轻松反编译并阅读类源码。以下步骤指导你如何操作。
首先,确保你的本地 Maven 仓库已包含 jar 包。这里以阿里巴巴的 fastjson 包为例,其版本号为 1.2.。你可以在本地 .m2 仓库中找到并选择任意一个 jar 包。
接着,使用 WinRAR 或其他解压工具,将选中的 jar 包解压至当前文件夹中。解压后,你将看到一个名为 fastjson 的文件夹。
在解压出的 fastjson 文件夹内,寻找 JSON.class 文件。找到文件后,直接将鼠标拖拽至 IDEA 编辑器中即可。至此,你已成功反编译并打开了 jar 包中的源码。
这个方法简便高效,适用于快速查看和理解 jar 包内类的实现细节。通过这种方式,你不仅能更直观地了解代码逻辑,还有助于解决实际开发中遇到的问题。
来源:toutiao.com/i...
2024-11-27 11:55
2024-11-27 11:50
2024-11-27 11:27
2024-11-27 10:42
2024-11-27 10:33
2024-11-27 10:16