反射+注解+泛型

一、反射

1.1 反射是什么

Java的反射(reflection)机制是运行时获取类的信息(构造函数、属性、方法、注解)。

1.2 反射的作用

1.创建类的对象

2.获取类中的属性,并设置属性的值或者获取属性的值

3.获取类中的方法,可以执行方法(包含私有)

4.获取注解信息

1.3 反射的应用

1.创建类的对象,比如JSON解析,框架中的某些类等

2.获取或设置属性的内容 Field 比如 JSON解析,JDBC封装等

3.执行方法,可以调用Method invoke 代理模式

1.4 反射的演示

全限定类名:类的全称,包含:包名.类名

public static void main(String[] args) {
    //反射 Class 字节码 创建Class对象
    //Class对象的三种创建方式 1.类名.class 2.对象名.getClass() 3.Class.forName("全限定类名")
    //1.创建Class对象
    Class clz=Teacher.class;
    //2.获取类中的公共属性
    Field[] fields1=clz.getFields();//获取类中公共访问修饰符的属性,包含继承
    for(Field f:fields1){
        System.out.println(f.getName());
    }
    System.out.println("---------");
    //3.获取类中的所有属性,不包含继承的
    Field[] fields2=clz.getDeclaredFields();//获取类中的所有属性,不包含父类中的
    for(Field f:fields2){
        System.out.println(f.getName());
    }
    System.out.println("---------");
    //4.获取公共方法
    Method[] methods1=clz.getMethods();//获取类中公共访问修饰符的方法,包含继承
    for(Method m:methods1){
        System.out.println(m.getName());
    }
    System.out.println("**********");
    //5.获取所有方法,不包含父类的
    Method[] methods2=clz.getDeclaredMethods();//获取类中的所有方法,不包含父类中的
    for(Method m:methods2){
        System.out.println(m.getName());
    }
    }

1.5 反射总结

1.Class对象创建方式

  • 类名.class

  • 对象名.getClass()
  • Class.forName("全称类名")

2.Class中常用的方法

返回值

方法名

作用

Field[]

getFields

获取类中公共访问修饰符的属性,包含继承

Field[]

getDeclaredFields

获取类中的所有属性,不包含父类中的

Field

getDeclaredField(属性名)

获取类中的指定的属性

Method[]

getMethods

获取类中公共访问修饰符的方法,包含继承

Method[]

getDeclaredMethods

获取类中的所有方法,不包含父类中的

Method

getDeclaredField

获取类中的指定的方法

Object

newInstance

创建类的对象

3.Field的常用方法

getName 获取属性名

setAccessible 设置是否忽略访问修饰符

set() 设置属性的值

4.Method的常用方法

setAccessible 设置是否忽略访问修饰符

invoke 执行方法

1.6 反射实际应用

解析字符串

public static void main(String[] args) throws InstantiationException, IllegalAccessException, NoSuchFieldException {
        String str="name=贝贝&sex=女&info=自恋!";
        //请实现字符串转换为Teacher对象
        //1.解析字符串
        //2.对象创建 属性赋值
        //创建Class对象 -反射
        Class clz=Teacher.class;
        //创建类的对象
        Teacher teacher= (Teacher) clz.newInstance();
        //字符串常用方法 解析字符串 切割& 字符串数组
        String[] strs1=str.split("&");

        System.out.println(Arrays.toString(strs1));
        //循环遍历 键值对
        for(String s1:strs1){
            //切割=
            String[] strs2=s1.split("=");
            System.out.println(Arrays.toString(strs2));
            //反射 获取指定的属性对象
            Field field=clz.getDeclaredField(strs2[0]);
            if(field!=null){
                //设置忽略访问修饰符
                field.setAccessible(true);
                //赋值
                field.set(teacher,strs2[1]);
            }
        }
        System.out.println(teacher);
    }

二、注解

2.1 注解是什么

Java 注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种注释机制。可以为代码添加注释

2.2 注解的作用

1.解决不一致的问题,比如数据库的字段名和类的属性名不一样,可以实现自定义注解

2.标记,特殊声明,比如自定义令牌校验、参数校验等

2.3 自定义注解的实现

定义:

@Target({ElementType.TYPE,ElementType.METHOD,ElementType.FIELD})//设置注解的修饰范围,type 修饰类或接口
@Retention(RetentionPolicy.RUNTIME) //设置注解什么时候被发现,运行时 反射
public @interface MyVersion {
    //定义注解中的属性
    String version() default "V1.0.0";
}

使用:

@MyVersion(version = "V2.2.2") //使用自定义注解
public class Food {
    private int id;
    private String name;
    private double price;

    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 double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }
}

生效:获取注解的内容

public static void main(String[] args) {
        //获取Class对象
        Class clz=Food.class;
        //获取指定注解对象
        MyVersion version= (MyVersion) clz.getDeclaredAnnotation(MyVersion.class);
        //获取注解的内容
        System.out.println(version.version());
}

三、泛型

3.1 泛型是什么

Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。

其实就是解决类型转换的问题,是引用类型的占位符,避免转型

3.2 泛型的作用

实现引用类型的占位符,避免类型转换

3.3 泛型的使用

定义类或定义方法的使用可以使用泛型,如果类不确定,或者支持多种类型,可以使用泛型

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cjy_行业报告

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值