guyanqing 1 年間 前
コミット
257d30aea3

+ 24 - 0
src/main/java/com/sf/day24/Column.java

@@ -0,0 +1,24 @@
+package com.sf.day24;
+
+import java.lang.annotation.*;
+
+/**
+ * 数据库中 字段    -====  java  属性
+ * java:
+ * 实体类      属性
+ * User      id  name
+ *
+ * mysql
+ * 数据库表(表)    字段
+ * user         id  name
+ *
+ *
+ * 效果  @Column(columnName = "id",columnType = "int")
+ */
+@Inherited
+@Target(ElementType.FIELD)   //注解作用在属性上
+@Retention(RetentionPolicy.RUNTIME)
+public @interface Column {
+    String columnName();
+    String columnType();
+}

+ 43 - 0
src/main/java/com/sf/day24/Student.java

@@ -0,0 +1,43 @@
+package com.sf.day24;
+
+public class Student {
+    private int id;
+    private String name;
+
+    public Student() {
+    }
+
+    public Student(int id, String name) {
+        this.id = id;
+        this.name = 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;
+    }
+
+    public static String getInfo(String name){
+        System.out.println("============="+name);
+        return name;
+    }
+
+    @Override
+    public String toString() {
+        return "Student{" +
+                "id=" + id +
+                ", name='" + name + '\'' +
+                '}';
+    }
+}

+ 26 - 0
src/main/java/com/sf/day24/Table.java

@@ -0,0 +1,26 @@
+package com.sf.day24;
+
+import java.lang.annotation.*;
+
+/**
+ * 自定义注解
+ * @Inherited   : 是一个元注解 最主要的   是否被继承
+ * @Target(ElementType.TYPE)      : 表明该注解的使用位置  (类上/方法上)     只能作用在类上面
+ * @Target(ElementType.METHOD)   该注解只能作用在发方法上
+ * @Target(ElementType.FIELD)    该注解只能作用在属性上
+ * @Target(ElementType.CONSTRUCTOR)  该注解只能作用在构造器上
+ *
+ * @Retention(RetentionPolicy.RUNTIME) : 表明该注解的声明周期    在运行阶段
+ *
+ *
+ * 定义注解的方法@interface
+ *
+ * @Table(value="admin");
+ * @Table("admin")
+ */
+@Inherited
+@Target(ElementType.TYPE)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface Table {
+    String value();
+}

+ 106 - 0
src/main/java/com/sf/day24/Test01.java

@@ -0,0 +1,106 @@
+package com.sf.day24;
+
+import org.junit.Test;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+
+/**
+ * 通过反射调用指定的属性和方法
+ */
+public class Test01 {
+
+    @Test
+    public void t1() throws ClassNotFoundException, NoSuchFieldException, InstantiationException, IllegalAccessException {
+        //创建Student的class对象
+        Class<?> aClass = Class.forName("com.sf.day24.Student");
+        //获取属性对象   NAME  id
+        Field field = aClass.getDeclaredField("id");
+        //取消java语言检查访问
+        field.setAccessible(true);
+
+        //创建实例对象
+        Object obj = aClass.newInstance();
+
+        //给属性id设置值
+        field.set(obj,13);
+
+        //获取属性值
+        Object o = field.get(obj);
+        System.out.println(o);
+
+    }
+
+    /**
+     * 反射中方法的执行
+     */
+    @Test
+    public void t2() throws NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException {
+        //常见Student的class对象
+        Class<Student> clazz = Student.class;
+        //获取方法对象
+        Method method = clazz.getDeclaredMethod("setName", String.class);
+        //创建实例对象
+        Student student = clazz.newInstance();
+        //调用方法
+        method.invoke(student, "zhangsan");
+//        System.out.println(zhangsan);
+        System.out.println(student);
+
+        Method getName = clazz.getDeclaredMethod("getName");
+        Object invoke = getName.invoke(student);
+        System.out.println(invoke);
+    }
+
+    /**
+     * 静态的调用
+     *
+     */
+    @Test
+    public void t3() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
+        Class<Student> studentClass = Student.class;
+        Method getInfo = studentClass.getDeclaredMethod("getInfo", String.class);
+        Object lisa = getInfo.invoke(null, "lisa");
+        //getInfo  的返回值是void
+        System.out.println(lisa);
+    }
+
+
+    /**
+     * 看我写就行啦
+     * sql语句    SELECT  id,name FROM user     查询user表里的全部记录(信息)
+     */
+    @Test
+    public void t4(){
+        //创建user的class类
+        Class<User> userClass = User.class;
+        Table annotation = userClass.getAnnotation(Table.class);
+        String tableName="";
+        if(annotation !=null){
+            tableName = annotation.value();
+        }
+        //获取属性对象数组
+        Field[] declaredFields = userClass.getDeclaredFields();
+        String[] columns =  new String[declaredFields.length];
+        int index= 0;
+        for (Field declaredField : declaredFields) {
+            Column column = declaredField.getAnnotation(Column.class);
+            if(column != null){
+                columns[index++]= column.columnName();
+            }
+        }
+
+        String sql = "SELECT ";
+        for (int i= 0 ; i<index;i++){
+            sql+=columns[i];
+            if(i<index-1){
+                sql +=",";
+            }
+        }
+       sql+=" FROM "+tableName;
+
+        //  SELECT id,name FROM user
+        System.out.println("最后的完整sql是==="+sql);
+    }
+}

+ 42 - 0
src/main/java/com/sf/day24/User.java

@@ -0,0 +1,42 @@
+package com.sf.day24;
+
+@Table(value = "user")
+public class User {
+    @Column(columnName = "id",columnType = "int")
+    private int id;
+
+    @Column(columnName = "name",columnType = "varchar(25)")
+    private String name;
+
+    public User() {
+    }
+
+    public User(int id, String name) {
+        this.id = id;
+        this.name = 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 "User{" +
+                "id=" + id +
+                ", name='" + name + '\'' +
+                '}';
+    }
+}

BIN
target/classes/com/sf/day23/Test01.class


BIN
target/classes/com/sf/day24/Column.class


BIN
target/classes/com/sf/day24/Student.class


BIN
target/classes/com/sf/day24/Table.class


BIN
target/classes/com/sf/day24/Test01.class


BIN
target/classes/com/sf/day24/User.class