最后
面试是跳槽涨薪最直接有效的方式,马上金九银十来了,各位做好面试造飞机,工作拧螺丝的准备了吗?
掌握了这些知识点,面试时在候选人中又可以夺目不少,暴击9999点。机会都是留给有准备的人,只有充足的准备,才可能让自己可以在候选人中脱颖而出。
dependencies {
compile gradleApi()
compile ‘com.android.tools.build:gradle:3.1.0’
//tools.jar 的依赖
compile files(org.gradle.internal.jvm.Jvm.current().toolsJar)
}
编写自定义 javadoc 判断 @author 工具
public class JavaDocReader {
private static RootDoc root;
//自定义 doclet
public static class CustomerDoclet {
public static boolean start(RootDoc root) {
JavaDocReader.root = root;
return true;
}
}
//tools.jar 中 javadoc 的封装
public static RootDoc process(String[] extraArges) {
List argsOrderList = new ArrayList<>();
argsOrderList.add(“-doclet”);
argsOrderList.add(CustomerDoclet.class.getName());
argsOrderList.addAll(Arrays.asList(extraArges));
String[] args = argsOrderList.toArray(new String[argsOrderList.size()]);
System.out.println(args);
Main.execute(args);
return root;
}
//tools.jar 中 javadoc 的封装
public static void process(List sourcePaths, List javapackages,
List excludePackages, String outputDir) throws Exception {
String paths = list2formatString(sourcePaths, “;”);
String includes = list2formatString(javapackages, “:”);
String excludes = list2formatString(excludePackages, “:”);
List argsOrderList = new ArrayList<>();
argsOrderList.add(“-doclet”);
argsOrderList.add(CustomerDoclet.class.getName());
if (paths != null && paths.length() > 0) {
argsOrderList.add(“-sourcepath”);
argsOrderList.add(paths);
}
argsOrderList.add(“-encoding”);
argsOrderList.add(“utf-8”);
argsOrderList.add(“-verbose”);
if (includes != null && includes.length() > 0) {
argsOrderList.add(“-subpackages”);
argsOrderList.add(includes);
}
if (excludes != null && excludes.length() > 0) {
argsOrderList.add(“-exclude”);
argsOrderList.add(excludes);
}
String[] args = argsOrderList.toArray(new String[argsOrderList.size()]);
System.out.println(Arrays.toString(args));
//执行 tools.jar 中的 javadoc 命令
Main.execute(args);
File file = new File(outputDir);
if (!file.exists()) {
file.mkdirs();
}
file = new File(file, new Date().toString() + “.txt”);
FileOutputStream outputStream = new FileOutputStream(file);
//判断每个顶级 java class 是否有编写 @author 人,没有就筛出来写入一个文件记录
ClassDoc[] classes = root.classes();
if (classes != null) {
for (int i = 0; i < classes.length; ++i) {
if (classes[i].containingClass() == null && classes[i].isPublic()) {
Tag[] authorTags = classes[i].tags(“author”);
if (authorTags == null || authorTags.length == 0) {
String filename = classes[i].position().file().getAbsolutePath();
outputStream.write((filename+“\r\n”).getBytes());
}
}
}
}
root = null;
outputStream.flush();
outputStream.close();
}
private static String list2formatString(List srcs, String div) {
StringBuilder stringBuilder = new StringBuilder();
for (int index=0; index<srcs.size(); index++) {
if (index > 0) {
stringBuilder.append(div);
}
stringBuilder.append(srcs.get(index));
}
return stringBuilder.toString();
}
}
有了 javadoc 自定义工具类,接下来编写 gradle 自定义 task 即可。
编写自定义 gradle task 进行检查
//groovy 编写
class JavaDocCheckerTask extends DefaultTask {
//自定义 task 的输入
@Input
List includePackages
@Input
List excludePackages
@Input
List sourcePaths
//自定义 task 的输出
@OutputDirectory
String outputDir
//自定义 task 的执行逻辑
@TaskAction
void checker() {
if (sourcePaths == null || sourcePaths.size() == 0) {
throw new GradleScriptException(“JavaDocCheckerTask sourcePaths params can’t be null or empty!”)
}
if (outputDir == null || outputDir.length() == 0) {
throw new GradleScriptException(“JavaDocCheckerTask outputDir params can’t be null or empty!”)
}
//task 依据输出输出参数进行 javadoc 命令操作
JavaDocReader.process(sourcePaths, includePackages, excludePackages, outputDir)
}
}
有了自定义 gradle task 进行 javadoc 操作,接下来就该接入插件了。
将自定义 task 加入构建 project
先定义插件的 extension 拓展参数:
class CheckerExtension {
public static final String NAME = “javadocChecker”
List includePackages
List excludePackages
List sourcePaths
String outputDirectory
}
将拓展参数与 task 结合:
class JavaDocCheckerPlugin implements Plugin {
@Override
void apply(Project project) {
//插件添加自定义 extension
project.extensions.create(CheckerExtension.NAME, CheckerExtension)
//将自定义任务加入 project
project.tasks.create(“javaDocChecker”, JavaDocCheckerTask)
//依据 apply 的是 java、androidlibrary、androidapplication 分别获取对应的拓展参数
JavaPluginConvention java = null
BaseExtension android = null
if (project.plugins.hasPlugin(AppPlugin)) {
android = project.extensions.getByType(AppExtension)
} else if(project.plugins.hasPlugin(LibraryPlugin)) {
android = project.extensions.getByType(LibraryExtension)
} else if (project.plugins.hasPlugin(JavaPlugin)) {
java = project.convention.getPlugin(JavaPluginConvention)
}
总结
在清楚了各个大厂的面试重点之后,就能很好的提高你刷题以及面试准备的效率,接下来小编也为大家准备了最新的互联网大厂资料。
[外链图片转存中…(img-iT9AK1yS-1715150590343)]
[外链图片转存中…(img-xAJ08KLl-1715150590344)]
[外链图片转存中…(img-3QmfjMAI-1715150590344)]
[外链图片转存中…(img-cDgUZ7WK-1715150590345)]