注解和反射

目录

  • 反射
    • 主要目的
    • 硬编码
    • API
    • 反射的过程:
    • 获得类的类型
    • 获得类的方法或属性
    • 创建类的对象
    • 思考题:
  • 注解
    • 常用注解:
    • 自定义注解:
    • 语法:
    • 通过反射读取注解的内容
    • 作业:

反射

主流框架中大量应用了反射技术

主要目的

对类的结构进行解析,实现代码的解耦

硬编码

Student stu = new Student(1,"张三",20);
stu.study();

反射机制对类的结构进行解析,读取类中的方法和属性,可以动态创建对象,可以实现方法的调用。

API

在java.refect包
Class 类的类型
Method 类的方法
Field 类的属性
Constructor 类的构造方法

反射的过程:

1)获得类的类型
2)获得类的方法或属性
3)创建类的对象
4)调用对象的方法或属性

获得类的类型

1)Class Class.forName("包名+类名")
2)Class 类名.class
3)Class 对象.getClass()

获得类的方法或属性

  • Method[] getMethods()
    获得类中所有方法(包含自己定义的方法和从父类继承的方法)
  • Method[] getDeclaredMethods()
    获得类中所有方法(包含自己定义的方法)
  • Method getMethod(String name,Class... paramTypes)
    获得特定方法,name是方法名
    paramTypes 是参数的类型
  • Method getDeclaredMethod(String name,Class... paramTypes)
    获得自己定义的特定方法
  • Field[] getFields()
    获得类中所有属性(包含自己定义的和从父类继承的)
  • Field[] getDeclaredtFields()
    获得类中所有属性(自己定义的)
  • Field getField(String name)
    获得属性,name是属性名
    paramTypes 是参数的类型
  • Field getDeclaredField(String name)
    获得自己定义的属性

创建类的对象

  1. Object 类型对象.newInstance()

    调用类型无参构造方法
  2. 调用类有参的构造方法创建对象
    1. 获得类的构造方法

    Constructor 类型对象.getDeclaredConstructor(Class... paramTypes)
    2. 通过构造方法创建对象

    Object Constructor对象.newInstance(参数...)

    调用对象的方法或属性

  • Method
    Object invoke(Object obj,Object... params) 调用方法
    返回值Object是方法的返回值类型
    第一个参数Object是调用此方法的对象
    Object... 调用此方法的实际参数

思考题:

如何结合JDBC和反射机制实现将查询数据转换为List集合

public class JdbcUtils2 {
    //查询多条数据
    public static  List queryList(Class clazz,String sql,Object... params){
        //使用JDBC查询得到ResultSet
        //创建List集合
        //循环遍历结果集,目的包装结果集的每一行数据到实体对象中
        //使用反射创建实体对象(表的列名和属性名相同)
        //获得类中所有属性
        //遍历到每个属性,用属性名到结果集中取数据 (getObject(列名))
        //使用反射给属性赋值
        //添加实体对象到集合
        //返回集合
        return null;
    }
}

注解

JDK1.5开始支持

可以在类、方法、属性上面添加一些额外的数据,起到标识作用

常用注解:

@Test               方法,标识测试方法
@WebServlet("url")      类,标识类是Servlet
@Override           方法,标识方法必须是重写父类的
@SuppressWarnings   抑制警告
@Depricated         标识属性或方法过时

自定义注解:

需要使用四个元注解(标识注解的注解)
@Documented     注解信息是否包含在文档(非必须)
@Inherited          是否被子类继承(非必须)
@Retention          使用注解的时机
    RetentionPolicy.Runtime     程序运行时
    RetentionPolicy.Source      编码时
    RetentionPolicy.Class       类加载时
@Target             使用注解的目标
    ElementType.Type          用在类、接口、枚举上
    ElementType.Method    用在方法上
    ElementType.Field         用在属性上

语法:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface Column {
        //列名
        String columnName();
}

@Column(columnName="列名")
类型 属性;

通过反射读取注解的内容

注解类型 column= 属性.getDeclaredAnnotation(注解的类型);
String cname = column.columnName();  //获得配置的内容

作业:

1)使用反射+JDBC实现表的查询返回List集合
2)通过注解配置属性的列名
    定义+使用+读取
3)思考:使用反射机制完成类似Gson的框架
    实现将Json数组解析为List集合
    class Person{
        private String name;
        private int age;
        //set、get....
    }
    String json = "[{\"name\":\"张三\",\"age\":\"20\"},{\"name\":\"李四\",\"age\":\"23\"}]";
    
方法定义:
public static  List fromJson(Class clazz,String json){
    ....
}

你可能感兴趣的:(注解和反射)