Java注解是一种特殊的代码元素,它可以在编译时或运行时被读取,并用于提供关于代码的元数据。它们可以用来标记代码,提供额外的信息,或者用来定义特定的行为。Java注解是一个强大的工具,可以帮助开发人员更好地理解和使用代码。
Java反射是一种机制,它允许在运行时检查和修改对象、字段、方法和构造函数。它使得开发人员能够在不了解对象内部结构的情况下使用对象。通过使用Java反射,开发人员可以动态创建对象、动态调用方法、动态修改字段值,并且能够在运行时检测对象的所有信息。
Class clazz = Class.forName("com.example.MyClass"); Object obj = clazz.newInstance(); Method method = clazz.getDeclaredMethod("myMethod", String.class); method.invoke(obj, "Hello World!");
程序元素上的注释是Java对象。
允许您访问其注释的程序元素实现java.lang.reflect.AnnotatedElement接口。
以下类实现了AnnotatedElement接口:
AnnotatedElement接口的方法用于访问以下列出的对象类型的注释。
java.lang.Class java.lang.reflect.Executable java.lang.reflect.Constructor java.lang.reflect.Field java.lang.reflect.Method java.lang.reflect.Parameter java.lang.Package java.lang.reflect.AccessibleObject
注释类型必须使用运行时的保留策略通过保留元注释注释,以便在运行时访问它。
假设你有一个Test类,并且你想打印它的所有注释。以下代码片段将打印Test类的类声明上的所有注释:
import java.lang.annotation.Annotation; @SuppressWarnings("unchecked") @Deprecated public class Main { public static void main(String[] argv) { // Get the class object reference Class<Main> c = Main.class; // Get all annotations on the class declaration Annotation[] allAnns = c.getAnnotations(); System.out.println("Annotation count: " + allAnns.length); // Print all annotations for (Annotation ann : allAnns) { System.out.println(ann); } } }
Annotation接口的toString()方法返回注释的字符串表示形式。
以下代码显示了如何获取特定注释。
import java.lang.annotation.Documented; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @Retention(RetentionPolicy.RUNTIME) @Documented @interface Version { int major(); int minor(); } @Version(major=1,minor=2) public class Main { public static void main(String[] argv) { Class<Main> c = Main.class; Version v = c.getAnnotation(Version.class); if (v == null) { System.out.println("Version annotation is not present."); } else { int major = v.major(); int minor = v.minor(); System.out.println("Version: major=" + major + ", minor=" + minor); } } }
上面的代码生成以下结果。
以下代码显示了如何访问方法的注释。
import java.lang.annotation.Annotation; import java.lang.annotation.Documented; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.reflect.AnnotatedElement; import java.lang.reflect.Method; @Retention(RetentionPolicy.RUNTIME) @interface Version { int major(); int minor(); } @Version(major = 1, minor = 0) class AccessAnnotation { @Version(major = 1, minor = 1) public void testMethod1() { } @Version(major = 1, minor = 2) @Deprecated public void testMethod2() { } } public class Main { public static void main(String[] args) { Class<AccessAnnotation> c = AccessAnnotation.class; System.out.println("Annotations for class:" + c.getName()); printAnnotations(c); System.out.println("Method annotations:"); Method[] m = c.getDeclaredMethods(); for (int i = 0; i < m.length; i++) { System.out.println("Annotations for method:" + m[i].getName()); printAnnotations(m[i]); } } public static void printAnnotations(AnnotatedElement programElement) { Annotation[] annList = programElement.getAnnotations(); for (int i = 0; i < annList.length; i++) { System.out.println(annList[i]); if (annList[i] instanceof Version) { Version v = (Version) annList[i]; int major = v.major(); int minor = v.minor(); System.out.println("Found Version annotation: " + "major =" + major + ", minor=" + minor); } } } }
上面的代码生成以下结果。
以下代码显示了如何在运行时访问可重复注释的实例。
import java.lang.annotation.Repeatable; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @Retention(RetentionPolicy.RUNTIME) @interface LogHistory { Log[] value(); } @Repeatable(LogHistory.class) @interface Log { String date(); String comments(); } @Log(date = "02/01/2014", comments = "A") @Log(date = "01/22/2014", comments = "B") public class Main { public static void main(String[] args) { Class<Main> mainClass = Main.class; Log[] annList = mainClass.getAnnotationsByType(Log.class); for (Log log : annList) { System.out.println("Date=" + log.date() + ", Comments=" + log.comments()); } Class<LogHistory> containingAnnClass = LogHistory.class; LogHistory logs = mainClass.getAnnotation(containingAnnClass); for (Log log : logs.value()) { System.out.println("Date=" + log.date() + ", Comments=" + log.comments()); } } }
上面的代码生成以下结果。
Java面向对象的设计 -Java接口继承接口可以从另一个接口继承。与类不同,接口可以从多个接口继承。interface Singer {void sing(...
Java数据类型教程 -Java数字数据类型字节,短整数,整数,长整数,浮点数和双精度类是数字包装类。它们都继承自抽象的Number类。...
JavaFX教程 -JavaFX VBoxVBox布局将子节点堆叠在垂直列中。新添加的孩子被放置在上一个子节点的下面。默认情况下,VBox尊重孩子...