Browse Source

1124 回顾注解

Demi 6 months ago
parent
commit
6b3eb9e659

+ 1 - 1
lesson/.idea/misc.xml

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <project version="4">
-  <component name="ProjectRootManager" version="2" languageLevel="JDK_17" default="true" project-jdk-name="corretto-17" project-jdk-type="JavaSDK">
+  <component name="ProjectRootManager" version="2" languageLevel="JDK_17" default="true" project-jdk-name="17" project-jdk-type="JavaSDK">
     <output url="file://$PROJECT_DIR$/out" />
   </component>
 </project>

+ 25 - 0
lesson/src/com/sf/anno/Test.java

@@ -0,0 +1,25 @@
+package com.sf.anno;
+
+// 注解是一个标签 可以放在代码中的很多地方
+//@TestAnno(id=5, msg="hello anno")
+@TestAnno
+public class Test {
+
+//    @TestAnno
+    private int num;
+
+//    @TestAnno
+    public Test() {
+    }
+
+    //    @TestAnno
+//    public void test(@TestAnno int param){
+//
+//    }
+}
+
+// 此时默认有一个注解 就是继承了父类的注解
+// @TestAnno
+class subCls extends Test{
+
+}

+ 30 - 0
lesson/src/com/sf/anno/TestAnno.java

@@ -0,0 +1,30 @@
+package com.sf.anno;
+
+import java.lang.annotation.*;
+
+// 声明这是一个注解
+// 元注解 是声明注解用法的注解
+//  Target 目标 指定注解使用的位置 ElementType是枚举类型
+//     如果是 ElementType.TYPE  那么意思是注解放在类上
+//     如果是 ElementType.FIELD  那么意思是注解放在字段上
+//     如果是 ElementType.METHOD  那么意思是注解放在方法上
+//     如果是 ElementType.PARAMETER  那么意思是注解放在方法参数上
+//     如果是 ElementType.CONSTRUCTOR  那么意思是注解放在构造器上
+// Retention 保留期 注解的存活时间
+//     RetentionPolicy是提供了几种使用保留期的方式
+//     如果是RetentionPolicy.SOURCE 只在源代码阶段保留 .java源代码 -> .class字节码 -> jvm识别为机器语言
+//     如果是RetentionPolicy.CLASS 只在字节码阶段保留 .java源代码 -> .class字节码 -> jvm识别为机器语言
+//     如果是RetentionPolicy.RUNTIME 在代码运行阶段也就是JVM中保留 .java源代码 -> .class字节码 -> jvm识别为机器语言
+// Inherited 如果注解被此注解标注 而子类没有被其他注解标注 那么子类会继承父类的注解
+@Inherited
+@Target({ElementType.TYPE})
+@Retention(RetentionPolicy.RUNTIME)
+public @interface TestAnno {
+
+    // 注解只有成员变量 没有方法
+    // 以没有入参的方法来声明变量
+    int id() default 0;
+    // 可以声明参数的默认值
+    String msg() default "";
+
+}

+ 17 - 0
lesson/src/com/sf/anno/my_mybatis/Column.java

@@ -0,0 +1,17 @@
+package com.sf.anno.my_mybatis;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+// 对应数据库中的字段
+@Target(ElementType.FIELD)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface Column {
+
+    // 字段名
+    String name();
+    // 字段类型
+    String type();
+}

+ 13 - 0
lesson/src/com/sf/anno/my_mybatis/Table.java

@@ -0,0 +1,13 @@
+package com.sf.anno.my_mybatis;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+// 设置一个注解 对应数据库中的表
+@Target(ElementType.TYPE)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface Table {
+    String value();
+}

+ 36 - 0
lesson/src/com/sf/anno/my_mybatis/Test.java

@@ -0,0 +1,36 @@
+package com.sf.anno.my_mybatis;
+
+import com.sf.anno.my_mybatis.entity.Student;
+
+import java.lang.reflect.Field;
+
+public class Test {
+
+    public static void main(String[] args) {
+        // 获取student类对象
+        //public class Student {
+        Class<Student> studentClass = Student.class;
+        // 获取类上的table注解  得到的是一个Table对象
+        // @Table("student")
+        Table tableAnno = studentClass.getAnnotation(Table.class);
+        String value = tableAnno.value();
+        System.out.println(value);
+
+        // 获取类的所有属性 得到属性数组
+        Field[] fields = studentClass.getDeclaredFields();
+        // iter 增强for循环的快捷键
+        // id  name
+        for (Field field : fields) {
+            //  @Column(name = "id",type = "int")
+            //  @Column(name = "name", type = "varchar(100)")
+            //  每一个部分 也是一个对象  是注解对应的对象
+            Column column = field.getAnnotation(Column.class);
+            String name = column.name();
+            String type = column.type();
+            System.out.println(name + "," + type);
+        }
+
+        // 通过获取不同位置的注解 来进行区分 以此得到配置化的处理
+        // select id,name from student;
+    }
+}

+ 38 - 0
lesson/src/com/sf/anno/my_mybatis/entity/Student.java

@@ -0,0 +1,38 @@
+package com.sf.anno.my_mybatis.entity;
+
+import com.sf.anno.my_mybatis.Column;
+import com.sf.anno.my_mybatis.Table;
+
+// 声明这个实体类对应的表 就是student
+@Table("student")
+public class Student {
+    // 声明在数据库中的字段名和字段类型
+    @Column(name = "id",type = "int")
+    private int id;
+    @Column(name = "name", type = "varchar(100)")
+    private String name;
+
+    public int getId() {
+        return id;
+    }
+
+    public void setId(int id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    @Override
+    public String toString() {
+        return "Student{" +
+                "id=" + id +
+                ", name='" + name + '\'' +
+                '}';
+    }
+}