JavaSE(2)09 反射--反射的泛型操作

反射

反射的泛型操作

  • Java采用泛型擦除的机制来引入泛型,Java中的泛型仅仅是给编译器javac使用的,确保数据的安全性和免去强制类型转换问题,但是一旦编译完成,所有和泛型有关的类型全部擦除
//通过反射获取泛型
@SuppressWarnings("all")
public class Demo11 {
    public static void test01(Map<String,Users> map, List<Users> list){
        System.out.println("test01");
    }
    public static Map<String,Users> test02(){
        System.out.println("test02");
        return null;
    }

    public static void main(String[] args) throws NoSuchMethodException {
        Method method01 = Demo11.class.getMethod("test01", Map.class, List.class);
        //获得泛型的参数类型
        Type[] genericParameterTypes = method01.getGenericParameterTypes();
        for (Type genericParameterType : genericParameterTypes) {
            System.out.println(genericParameterType);//java.util.Map<java.lang.String, com.phx.reflection.Users>
                                                    //java.util.List<com.phx.reflection.Users>
            //判断获取的泛型参数类型是否是参数化类型
            if(genericParameterType instanceof ParameterizedType ) {
                //获取泛型参数的真实参数信息
                Type[] actualTypeArguments = ((ParameterizedType) genericParameterType).getActualTypeArguments();
                for (Type actualTypeArgument : actualTypeArguments) {
                    System.out.println(actualTypeArgument); //class java.lang.String;class com.phx.reflection.Users
                                                            //class com.phx.reflection.Users
                }
            }
        }
        Method method02 = Demo11.class.getMethod("test02");
        Type genericReturnType = method02.getGenericReturnType();
        System.out.println(genericReturnType);//java.util.Map<java.lang.String, com.phx.reflection.Users>
        if(genericReturnType instanceof ParameterizedType) {
            Type[] actualTypeArguments = ((ParameterizedType) genericReturnType).getActualTypeArguments();
            for (Type actualTypeArgument : actualTypeArguments) {
                System.out.println(actualTypeArgument);//class java.lang.String ;class com.phx.reflection.Users
            }
        }
    }
}

获取注解信息

练习ORM
  • ORM(Object Relationship Mapping)–>对象关系映射
  • 把Java类及属性映射到数据库中
    • 类名---->表名
    • 属性---->字段
    • 对象---->记录
  • 利用注解和反射完成类和表结构的映射关系
//练习反射操作注解
public class Demo12 {
    public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException, InstantiationException {
        Class c1 = Student1.class;
        //通过反射获取注解
        Annotation[] annotations = c1.getAnnotations();
        for (Annotation annotation : annotations) {
            System.out.println(annotation);//@com.phx.reflection.MyTable(value=db_student)
        }
        //获得注解的值
        MyTable myTable= (MyTable) c1.getAnnotation(MyTable.class);
        String value = myTable.value();
        System.out.println(value);
        //获取类指定的注解
        Field id = c1.getDeclaredField("id");
        MyField myField =(MyField) id.getAnnotation(MyField.class);
        System.out.println(myField.columnName());//db_id
        System.out.println(myField.type());//int
        System.out.println(myField.length());//10
    }
}
@MyTable("db_student")
class Student1{
    @MyField(columnName = "db_id",type = "int",length = 10)
    private int id;
    @MyField(columnName = "db_name",type = "varchar",length = 20)
    private String name;
    @MyField(columnName = "db_age",type = "int",length = 10)
    private int age;
    public Student1(int id, String name, int age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }
    public Student1() {
    }

    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 int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student1{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
//类名的注解
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@interface MyTable{
    String value();
}
//属性的注解
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@interface MyField{
    String columnName();
    String type();
    int length();
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值