package org.fenixsoft.jvm.chapter10;
import javax.annotation.processing.Messager;
import javax.annotation.processing.ProcessingEnvironment;
import javax.lang.model.element.*;
import javax.lang.model.util.ElementScanner6;
import java.util.EnumSet;
import static javax.lang.model.element.ElementKind.*;
import static javax.lang.model.element.ElementKind.INTERFACE;
import static javax.lang.model.element.Modifier.*;
import static javax.tools.Diagnostic.Kind.WARNING;
/**
* 程序名称规范的编译器插件:<br>
* 如果程序命名不合规范,将会输出一个编译器的WARNING信息
*/
public class NameChecker {
private final Messager messager;
NameCheckScanner nameCheckScanner = new NameCheckScanner();
NameChecker(ProcessingEnvironment processsingEnv) {
this.messager = processsingEnv.getMessager();
}
/**
* 对Java程序命名进行检查,根据《Java语言规范》第三版第6.8节的要求,Java程序命名应当符合下列格式:
*
* <ul>
* <li>类或接口:符合驼式命名法,首字母大写。
* <li>方法:符合驼式命名法,首字母小写。
* <li>字段:
* <ul>
* <li>类、实例变量: 符合驼式命名法,首字母小写。
* <li>常量: 要求全部大写。
* </ul>
* </ul>
*/
public void checkNames(Element element) {
nameCheckScanner.scan(element);
}
/**
* 名称检查器实现类,继承了JDK 6中新提供的ElementScanner6<br>
* 将会以Visitor模式访问抽象语法树中的元素
*/
private class NameCheckScanner extends ElementScanner6<Void, Void> {
/**
* 此方法用于检查Java类
*/
@Override
public Void visitType(TypeElement e, Void p) {
scan(e.getTypeParameters(), p);
checkCamelCase(e, true);
super.visitType(e, p);
return null;
}
/**
* 检查方法命名是否合法
*/
@Override
public Void visitExecutable(ExecutableElement e, Void p) {
if (e.getKind() == METHOD) {
Name name = e.getSimpleName();
if (name.contentEquals(e.getEnclosingElement().getSimpleName()))
messager.printMessage(WARNING, "一个普通方法 “" + name + "”不应当与类名重复,避免与构造函数产生混淆", e);
checkCamelCase(e, false);
}
super.visitExecutable(e, p);
return null;
}
/**
* 检查变量命名是否合法
*/
@Override
public Void visitVariable(VariableElement e, Void p) {
// 如果这个Variable是枚举或常量,则按大写命名检查,否则按照驼式命名法规则检查
if (e.getKind() == ENUM_CONSTANT || e.getConstantValue() != null || heuristicallyConstant(e))
checkAllCaps(e);
else
checkCamelCase(e, false);
return null;
}
/**
* 判断一个变量是否是常量
*/
private boolean heuristicallyConstant(VariableElement e) {
if (e.getEnclosingElement().getKind() == INTERFACE)
return true;
else if (e.getKind() == FIELD && e.getModifiers().containsAll(EnumSet.of(PUBLIC, STATIC, FINAL)))
return true;
else {
return false;
}
}
/**
* 检查传入的Element是否符合驼式命名法,如果不符合,则输出警告信息
*/
private void checkCamelCase(Element e, boolean initialCaps) {
String name = e.getSimpleName().toString();
boolean previousUpper = false;
boolean conventional = true;
int firstCodePoint = name.codePointAt(0);
if (Character.isUpperCase(firstCodePoint)) {
previousUpper = true;
if (!initialCaps) {
messager.printMessage(WARNING, "名称“" + name + "”应当以小写字母开头", e);
return;
}
} else if (Character.isLowerCase(firstCodePoint)) {
if (initialCaps) {
messager.printMessage(WARNING, "名称“" + name + "”应当以大写字母开头", e);
return;
}
} else
conventional = false;
if (conventional) {
int cp = firstCodePoint;
for (int i = Character.charCount(cp); i < name.length(); i += Character.charCount(cp)) {
cp = name.codePointAt(i);
if (Character.isUpperCase(cp)) {
if (previousUpper) {
conventional = false;
break;
}
previousUpper = true;
} else
previousUpper = false;
}
}
if (!conventional)
messager.printMessage(WARNING, "名称“" + name + "”应当符合驼式命名法(Camel Case Names)", e);
}
/**
* 大写命名检查,要求第一个字母必须是大写的英文字母,其余部分可以是下划线或大写字母
*/
private void checkAllCaps(Element e) {
String name = e.getSimpleName().toString();
boolean conventional = true;
int firstCodePoint = name.codePointAt(0);
if (!Character.isUpperCase(firstCodePoint))
conventional = false;
else {
boolean previousUnderscore = false;
int cp = firstCodePoint;
for (int i = Character.charCount(cp); i < name.length(); i += Character.charCount(cp)) {
cp = name.codePointAt(i);
if (cp == (int) '_') {
if (previousUnderscore) {
conventional = false;
break;
}
previousUnderscore = true;
} else {
previousUnderscore = false;
if (!Character.isUpperCase(cp) && !Character.isDigit(cp)) {
conventional = false;
break;
}
}
}
}
if (!conventional)
messager.printMessage(WARNING, "常量“" + name + "”应当全部以大写字母或下划线命名,并且以字母开头", e);
}
}
}
jvm虚拟机源码学习资料
需积分: 0 79 浏览量
更新于2023-03-24
1
收藏 34KB ZIP 举报
《深入解析JVM虚拟机源码学习》
在Java编程领域,JVM(Java Virtual Machine)虚拟机扮演着至关重要的角色。它负责解释并执行Java字节码,为程序提供了跨平台运行的能力。理解JVM的工作原理对于优化代码性能、排查问题以及提升编程技艺都有着深远的影响。"jvm虚拟机源码学习资料"是一份专门针对JVM内部机制深度探索的学习资源,其中包含了配置jar包cglib-2.2.2.jar,这是一款常用的Java代码生成库,常用于动态代理和AOP(面向切面编程)场景。
1. JVM结构与工作原理
JVM主要由类装载器、运行时数据区、执行引擎、本地方法接口和本地方法库组成。类装载器负责加载类文件,运行时数据区包括堆内存、栈内存、方法区等,执行引擎则是执行字节码的引擎。本地方法接口用于调用非Java语言实现的本地方法,本地方法库则包含这些方法的具体实现。
2. 类装载过程
类的生命周期包括加载、验证、准备、解析和初始化五个阶段。加载是找到类的二进制数据,验证确保数据的正确性,准备分配静态变量内存,解析将符号引用转为直接引用,初始化执行类构造器。
3. 字节码执行
JVM通过解释器和即时编译器(如HotSpot的C1和C2编译器)共同作用来执行字节码。解释器逐行解释执行,而编译器将热点代码编译为本地机器码,提升运行效率。
4. 垃圾收集
JVM的内存管理核心是垃圾收集,包括新生代、老年代的划分,不同的垃圾收集算法(如复制算法、标记-清除算法、标记-整理算法、分代收集等),以及GC(Garbage Collection)停顿时间、内存占用等优化策略。
5. 类加载器
类加载器分为bootstrap classloader、extension classloader和app classloader,它们遵循双亲委派模型加载类。理解类加载器有助于解决类冲突、热部署等问题。
6. cglib库
cglib是一个强大的高性能的代码生成库,它在许多AOP框架中被使用,如Spring AOP。它能够生成子类,从而在运行时扩展Java类与实现接口。在JVM源码学习中,了解如何使用和配置cglib可以加深对动态代理机制的理解。
7. 优化实践
通过学习JVM源码,开发者可以深入理解内存模型、线程调度、方法调用等细节,进而进行针对性的性能优化,例如调整堆大小、设置合适的GC参数、使用并发友好的数据结构等。
"jvm虚拟机源码学习资料"提供了一个全面了解JVM内部运作的窗口,结合cglib库的实践,将帮助Java开发者提升技术水平,更好地驾驭这个复杂的运行环境,解决实际开发中的各种问题。通过深入学习,不仅可以提升代码质量和效率,还能增强问题诊断和解决能力,对个人职业发展大有裨益。
人间一两风i
- 粉丝: 11
- 资源: 4
最新资源
- gadget驱动研究论文
- 组装式箱式变电站3款工程图机械结构设计图纸和其它技术资料和技术方案非常好100%好用.zip
- rongxin11111111
- 116395807409340大猫vb登陆器.apk
- Win11操作系统高效快捷键全面指南
- Windows 10快捷键大全:提升工作效率的操作指南
- 2024年最全Nmap扫描技术与案例集锦(15类场景,102种命令)
- DigiShow 教程1 基本概念
- DigiShow 教程2 软件安装使用入门
- DigiShow 教程3 信号映射
- DigiShow 教程4 软件常用操作
- 小戴人工智能PurposeAI-20241205分词字符集识别的程序的详细解释 (第三版)
- SARibbon-qt
- EasyCode-sql server
- brightnessUI-ubuntu
- Pyqt5-pyqt5