- @Retention(RetentionPolicy.RUNTIME)
- @Inherited
- public @interface DBTable {
- public String name() default "";
- }
- @Target(ElementType.TYPE)
- @Retention(RetentionPolicy.RUNTIME)
- public @interface DBTable2 {
- public String name() default "";
- }
- package com.jyz.study.jdk.reflect;
- import java.util.Arrays;
- import com.jyz.study.jdk.annotation.DBTable;
- import com.jyz.study.jdk.annotation.DBTable2;
- /**
- * 1.演示从Class对象上获得反射元素Field Method Constructor
- * 2.演示AnnotatedElement接口的四个方法
- * @author JoyoungZhang@gmail.com
- *
- */
- public class DeclaredOrNot {
- public static void main(String[] args) {
- Class<Sub> clazz = Sub.class;
- System.out.println("============================Field===========================");
- //public + 继承
- System.out.println(Arrays.toString(clazz.getFields()));
- //all + 自身
- System.out.println(Arrays.toString(clazz.getDeclaredFields()));
- System.out.println("============================Method===========================");
- //public + 继承
- System.out.println(Arrays.toString(clazz.getMethods()));
- //all + 自身
- System.out.println(Arrays.toString(clazz.getDeclaredMethods()));
- System.out.println("============================Constructor===========================");
- //public + 自身
- System.out.println(Arrays.toString(clazz.getConstructors()));
- //all + 自身
- System.out.println(Arrays.toString(clazz.getDeclaredConstructors()));
- System.out.println("============================AnnotatedElement===========================");
- //注解DBTable2是否存在于元素上
- System.out.println(clazz.isAnnotationPresent(DBTable2.class));
- //如果存在该元素的指定类型的注释DBTable2,则返回这些注释,否则返回 null。
- System.out.println(clazz.getAnnotation(DBTable2.class));
- //继承
- System.out.println(Arrays.toString(clazz.getAnnotations()));
- //自身
- System.out.println(Arrays.toString(clazz.getDeclaredAnnotations()));
- }
- }
- @DBTable
- class Super{
- private int superPrivateF;
- public int superPublicF;
- public Super(){
- }
- private int superPrivateM(){
- return 0;
- }
- public int superPubliceM(){
- return 0;
- }
- }
- @DBTable2
- class Sub extends Super{
- private int subPrivateF;
- public int subPublicF;
- private Sub(){
- }
- public Sub(int i){
- }
- private int subPrivateM(){
- return 0;
- }
- public int subPubliceM(){
- return 0;
- }
- }
- console output:
- ============================Field===========================
- [public int com.jyz.study.jdk.reflect.Sub.subPublicF, public int com.jyz.study.jdk.reflect.Super.superPublicF]
- [private int com.jyz.study.jdk.reflect.Sub.subPrivateF, public int com.jyz.study.jdk.reflect.Sub.subPublicF]
- ============================Method===========================
- [public int com.jyz.study.jdk.reflect.Sub.subPubliceM(), public int com.jyz.study.jdk.reflect.Super.superPubliceM(), public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException, public final void java.lang.Object.wait() throws java.lang.InterruptedException, public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException, public boolean java.lang.Object.equals(java.lang.Object), public java.lang.String java.lang.Object.toString(), public native int java.lang.Object.hashCode(), public final native java.lang.Class java.lang.Object.getClass(), public final native void java.lang.Object.notify(), public final native void java.lang.Object.notifyAll()]
- [private int com.jyz.study.jdk.reflect.Sub.subPrivateM(), public int com.jyz.study.jdk.reflect.Sub.subPubliceM()]
- ============================Constructor===========================
- [public com.jyz.study.jdk.reflect.Sub(int)]
- [private com.jyz.study.jdk.reflect.Sub(), public com.jyz.study.jdk.reflect.Sub(int)]
- ============================AnnotatedElement===========================
- true
- @com.jyz.study.jdk.annotation.DBTable2(name=)
- [@com.jyz.study.jdk.annotation.DBTable(name=), @com.jyz.study.jdk.annotation.DBTable2(name=)]
- [@com.jyz.study.jdk.annotation.DBTable2(name=)]
-
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Inherited public @interface DBTable { public String name() default ""; } @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) public @interface DBTable2 { public String name() default ""; } package com.jyz.study.jdk.reflect; import java.util.Arrays; import com.jyz.study.jdk.annotation.DBTable; import com.jyz.study.jdk.annotation.DBTable2; /** * 1.演示从Class对象上获得反射元素Field Method Constructor * 2.演示AnnotatedElement接口的四个方法 * @author JoyoungZhang@gmail.com * */ public class DeclaredOrNot { public static void main(String[] args) { Class<Sub> clazz = Sub.class; System.out.println("============================Field==========================="); //public + 继承 System.out.println(Arrays.toString(clazz.getFields())); //all + 自身 System.out.println(Arrays.toString(clazz.getDeclaredFields())); System.out.println("============================Method==========================="); //public + 继承 System.out.println(Arrays.toString(clazz.getMethods())); //all + 自身 System.out.println(Arrays.toString(clazz.getDeclaredMethods())); System.out.println("============================Constructor==========================="); //public + 自身 System.out.println(Arrays.toString(clazz.getConstructors())); //all + 自身 System.out.println(Arrays.toString(clazz.getDeclaredConstructors())); System.out.println("============================AnnotatedElement==========================="); //注解DBTable2是否存在于元素上 System.out.println(clazz.isAnnotationPresent(DBTable2.class)); //如果存在该元素的指定类型的注释DBTable2,则返回这些注释,否则返回 null。 System.out.println(clazz.getAnnotation(DBTable2.class)); //继承 System.out.println(Arrays.toString(clazz.getAnnotations())); //自身 System.out.println(Arrays.toString(clazz.getDeclaredAnnotations())); } } @DBTable class Super{ private int superPrivateF; public int superPublicF; public Super(){ } private int superPrivateM(){ return 0; } public int superPubliceM(){ return 0; } } @DBTable2 class Sub extends Super{ private int subPrivateF; public int subPublicF; private Sub(){ } public Sub(int i){ } private int subPrivateM(){ return 0; } public int subPubliceM(){ return 0; } } console output: ============================Field=========================== [public int com.jyz.study.jdk.reflect.Sub.subPublicF, public int com.jyz.study.jdk.reflect.Super.superPublicF] [private int com.jyz.study.jdk.reflect.Sub.subPrivateF, public int com.jyz.study.jdk.reflect.Sub.subPublicF] ============================Method=========================== [public int com.jyz.study.jdk.reflect.Sub.subPubliceM(), public int com.jyz.study.jdk.reflect.Super.superPubliceM(), public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException, public final void java.lang.Object.wait() throws java.lang.InterruptedException, public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException, public boolean java.lang.Object.equals(java.lang.Object), public java.lang.String java.lang.Object.toString(), public native int java.lang.Object.hashCode(), public final native java.lang.Class java.lang.Object.getClass(), public final native void java.lang.Object.notify(), public final native void java.lang.Object.notifyAll()] [private int com.jyz.study.jdk.reflect.Sub.subPrivateM(), public int com.jyz.study.jdk.reflect.Sub.subPubliceM()] ============================Constructor=========================== [public com.jyz.study.jdk.reflect.Sub(int)] [private com.jyz.study.jdk.reflect.Sub(), public com.jyz.study.jdk.reflect.Sub(int)] ============================AnnotatedElement=========================== true @com.jyz.study.jdk.annotation.DBTable2(name=) [@com.jyz.study.jdk.annotation.DBTable(name=), @com.jyz.study.jdk.annotation.DBTable2(name=)] [@com.jyz.study.jdk.annotation.DBTable2(name=)]
三.代码说明
- 代码演示了从Class对象上获得反射元素Field Method Constructor时get*和getDeclared*的区别。
- 代码演示了AnnotatedElement接口的四个方法。
- java.lang.reflect.AnnotatedElement表示可以被注解的元素。它只有四个方法,参考代码DeclaredOrNot.java。
- 当我使用clazz.getAnnotations()时,我期望得到控制台打印出来的内容,但实际上却只得到了[@com.jyz.study.jdk.annotation.DBTable2(name=)],后来发现是DBTable里没有声明@Inherited。
相关推荐
@Inherited 注解只会使得注解从父类继承到子类中,而不会从接口继承过来。 最后,在使用 @Inherited 注解时,我们需要注意注解的可见性。如果我们在一个私有类中添加了 @Inherited 注解,那么这个注解将不会被子类...
- `@Inherited`:使子类继承父类的注解。 4. **Javadoc注解** - Javadoc工具利用注解生成API文档,识别如`@author`、`@deprecated`、`@param`等特殊标签。 - `@author`:标识类的作者。 - `@deprecated`:标记...
例如,@Target({ElementType.METHOD,ElementType.TYPE})指定了注解的作用域为方法和类型,@Retention(RetentionPolicy.RUNTIME)指定了注解的生命周期为运行时,@Inherited允许子类继承。 解析注解是通过反射获取类...
- `@Inherited`:使子类继承父类的注解,但这仅适用于类注解,不适用于方法或字段。 5. **注解的应用场景**: - **代码生成**:如Lombok库使用注解生成getter、setter等方法。 - **依赖注入**:Spring框架利用...
- `@Inherited`:使子类继承父类的注解。 四、处理器和注解处理 1. JSR 269:提供了处理注解的API,允许开发者编写注解处理器来生成源代码或类文件。 2. `@Processor`:注解处理器接口,实现该接口的类会在编译时...
@Inherited元注解也是一个标记注解,它允许子类继承父类的注解。这意味着如果一个类使用了被@Inherited修饰的注解,那么它的子类也会被视为使用了该注解,除非子类显式地覆盖了这个注解。但需要注意的是,只有标记...
- `@Inherited`:子类是否继承父类的注解。 - `@Repeatable`:允许同一个类型的注解在同一位置重复使用。 8. **最佳实践**: - 使用注解时要保持简洁,避免过度使用。 - 明确注解的目的,避免引起混淆。 - ...
4. `@Inherited`:允许子类继承父类的注解,但仅限于类层次,不适用于方法和字段。 5. `@Repeatable`(JDK8新增):允许一个注解在同一位置被多次使用。之前版本中,如果需要多次使用同一注解,需要自定义容器注解...
- `@Inherited`:使子类继承父类的注解,但仅适用于类,不适用于方法或字段。 - `@Repeatable`:Java 8引入,允许在同一元素上多次应用相同的注解。 3. **自定义注解** - 开发者可以创建自己的注解,以满足特定...
- `@Inherited`:使子类继承父类的注解。 - `@Repeatable`:允许同一个位置使用多个相同类型的注解。 ### 四、使用自定义注解 在代码中使用自定义注解,格式如下: ```java @<注解名>(<成员名1>=<成员值1>, <成员...
- `@Inherited`:允许子类继承父类的注解。 7. **注解处理器**: 使用Java的`javax.annotation.processing`包,可以编写注解处理器来在编译时处理注解。处理器通过`process()`方法响应注解,并可以生成额外的源...
- `@Inherited`:使子类继承父类的注解,但只有`@Inherited`的注解才能被继承。 3. **注解的属性与默认值** - 注解可以包含属性,这些属性可以有默认值。例如,如果只有一个属性且名为`value`,可以省略`value=`...
4. `@Inherited`:允许子类继承父类中的注释。 在 Java 中定义自己的注解 Java 语言支持一种新的类型--注释类型(annotation type),跟普通类差不多,在类中以符号( `@` )的形式注释其他 Java 代码。 例如: `...
- `@Inherited`:允许子类继承父类的注解(仅适用于类型注解)。 4. **自定义注解** - 自定义注解需要定义一个接口,接口的名称即为注解的名称,接口的方法是注解的属性。 - 注解属性可以有默认值,也可以没有。...
- `@Inherited`: 让子类继承父类的注解,但只适用于类,不适用于方法和字段。 5. **自定义注解** 自定义注解可以有自己的属性,属性值在使用注解时指定。注解元素的默认值可以通过在接口定义中指定。注解处理器...
* @Inherited:是否允许子类继承该注解 * @Repeatable:表示被修饰的注解可以用在同一个声明式或者类型加上多个相同的注解(包含不同的属性值) 这些元注解可以用来定义自己的注解,例如: * @Target(ElementType....
Java预定义了四个元注解:@Retention、@Target、@Documented和@Inherited。 - @Retention:定义注解的生命周期,有SOURCE、CLASS和RUNTIME三个策略。SOURCE表示注解只在源代码中存在,编译后会被丢弃;CLASS表示...
4. `@Inherited`:使子类继承父类的注解。 5. `@Repeatable`:允许一个注解在同一位置重复出现。 **自定义注解** 创建自定义注解需要定义注解的类型,如: ```java @Retention(RetentionPolicy.RUNTIME) @Target...
此外,还可以使用元注解来修饰自定义注解,例如`@Retention`控制注解的生命周期,`@Target`指定注解可以应用于哪些程序元素,`@Documented`指示是否包含在Javadoc中,`@Inherited`让子类继承父类的注解。 在实际...
- `@Inherited`:允许子类继承父类上的注解。 #### 总结 Java注解为代码提供了额外的维度,它们不仅是代码的补充说明,更是现代软件开发中不可或缺的一部分,用于自动化任务、增强框架功能和提高代码质量。理解和...