2014年夏末大Java新闻

正如即将到来的JavaOne那样 ,最近在Java社区中已经有很多重大新闻。 这篇文章简要地引用了其中的三个项目(Java SE 8更新,Java SE 9和Java EE 8),并对我发现这是我在类路径/类加载器问题上见过的更清楚的文章之一进行了“奖励”引用。

Oracle Java 8 JVM中的字符串重复数据删除

在“ 字符串重复数据删除-Java 8 Update 20中的一项新功能”中Fabian Lange使用JDK 8 Update 20引入的JVM选项-XX:+UseStringDeduplicationG1垃圾收集器引入了字符串重复数据删除Java启动器工具页面已更新,其中提到了 JVM选项-XX:+UseStringDeduplication-XX:+PrintStringDeduplicationStatistics-XX:StringDeduplicationAgeThreshold 。 有关JDK 8 Update 20的更多详细信息,请参见发布的博客文章:Oracle Java Development Kit 8,Update 20 。 Lange帖子还引发了有关Java subreddit上的此和相关JVM选项的讨论

Java 9功能

自从宣布OpenJDK JDK 9项目以来,Java 9一直是Java社区中讨论的热门话题。 期待已久的Java模块化从JDK 8启动的 Jigsaw项目 )可能是Java 9预期的最大新功能。Paul Krill在《 为什么开发人员应该对Java 9感到兴奋的原因》中写道:“ Jigsaw并不是唯一的新功能。适用于Java9。对流行的JSON(JavaScript对象表示法)数据交换格式的支持以及流程API,代码缓存和锁定改进也是关键特性。 目前在该OpenJDK JDK 9页面上建议的六个JEP是102( 进程API更新 ),143( 改进竞争锁 ),197( 分段代码缓存 ),198(轻型JSON API),199( 智能Java编译,第2阶段) )和201( 模块化源代码 )。

Java 9随附money API的博客文章中, otaviojava引入了JSR 354 (“ JSR 354:Money and Currency API”),描述了为什么需要它,涵盖了如何实现它,并总结说:“该API有望[在Java 9中。”

Java EE 8

Reza Rahman的帖子Java EE 8起飞了! 谈论开始的JSR 366Java EE 8规范)。 这篇文章列出了Java EE的一些预期的高级内容,以及到相关JSR的链接。

揭秘Java类路径

Java类路径问题无疑是Java开发人员可能面临的更困难的挑战之一。 Jar Hell简化了文章–使用jHades揭开类路径的神秘面纱,它很好地概述了与类路径和类加载器相关的一些最常见问题,并简要解释了它们为什么会发生。 我没有使用jHades ,但是这篇文章的质量肯定激发了我对该工具的兴趣。

结论

“ Java”(SE,EE,JVM等)不断发展并为我们带来了新的语言功能,库和工具。 这篇文章引用了一些帖子,这些帖子着重介绍了JDK 8,JDK 9和Java EE 8的最新发展。

翻译自: https://www.javacodegeeks.com/2014/09/big-java-news-in-late-summer-2014.html

Java 中,注解是在编译时处理的,因此要在编译时修改属性上的注解内容,需要使用 Java 的 annotation processing 工具(APT)。 APT 是一种在编译时扫描和处理 Java 注解的工具,它可以在编译期间生成新的 Java 代码,并将其编译成可执行的程序。APT 工具提供了许多 API,可以用来读取和修改源代码上的注解信息。 下面是一个简单的例子,演示如何在编译时修改属性上的注解内容: ```java @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) public @interface MyAnnotation { String value(); } public class MyClass { @MyAnnotation("old value") private String myField; } public class MyProcessor extends AbstractProcessor { @Override public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) { for (Element element : roundEnv.getElementsAnnotatedWith(MyAnnotation.class)) { if (element.getKind() == ElementKind.FIELD) { VariableElement variableElement = (VariableElement) element; MyAnnotation annotation = variableElement.getAnnotation(MyAnnotation.class); String newValue = "new value"; MyAnnotation newAnnotation = new MyAnnotation() { @Override public String value() { return newValue; } @Override public Class<? extends Annotation> annotationType() { return MyAnnotation.class; } }; AnnotatedTypeMirror.AnnotatedDeclaredType fieldType = (AnnotatedTypeMirror.AnnotatedDeclaredType) variableElement.asType(); AnnotatedTypeMirror.AnnotatedDeclaredType annotatedFieldType = fieldType.replaceAnnotation(newAnnotation); variableElement.getEnclosingElement().getEnclosedElements().remove(variableElement); FieldSpec.Builder fieldBuilder = FieldSpec.builder(TypeName.get(annotatedFieldType.getUnderlyingType()), variableElement.getSimpleName().toString()); variableElement.getModifiers().forEach(modifier -> fieldBuilder.addModifiers(modifier)); fieldBuilder.addAnnotation(annotatedFieldType.getAnnotations().stream().map(AnnotationSpec::get).collect(Collectors.toList())); fieldBuilder.initializer("null"); FieldSpec fieldSpec = fieldBuilder.build(); JavaFile.builder(annotatedFieldType.getUnderlyingType().toString().replace('.', '/').replace('$', '/') + "Generated", fieldSpec) .build() .writeTo(processingEnv.getFiler()); } } return true; } } ``` 在这个例子中,`MyAnnotation` 是一个自定义的注解,`MyClass` 是一个包含注解属性的类。`MyProcessor` 是一个 APT 处理器,它会在编译时扫描和处理带有 `@MyAnnotation` 注解的元素。在 `process` 方法中,我们使用 `roundEnv.getElementsAnnotatedWith` 方法获取所有带有 `@MyAnnotation` 注解的元素,然后判断元素类型是否为字段。如果是字段,我们就可以使用 `variableElement.getAnnotation` 方法获取字段上的注解对象,然后构造一个新的注解对象并使用 `replaceAnnotation` 方法替换原有的注解对象。最后,我们可以使用 `JavaFile.builder` 方法创建一个新的 Java 文件,并将修改后的字段写入该文件中。 需要注意的是,APT 处理器需要在编译时自动运行,可以通过在 `build.gradle` 文件中配置以下内容来实现: ```groovy dependencies { compileOnly 'com.google.auto.service:auto-service:1.0-rc7' annotationProcessor 'your.package.MyProcessor' } sourceSets { main { java { srcDirs 'src/main/java', 'build/generated/source/apt/main' } } } compileJava.options.annotationProcessorPath = configurations.compileClasspath ``` 这个例子只是一个简单的示例,实际使用中可能需要更复杂的处理逻辑。但是,这个例子可以帮助你了解在编译时修改注解内容的基本原理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值