8.5day06 框架基础--反射+注解

文章目录

  • 反射
    • 获取类的各种信息
      • 获取类的字节码文件
  • 注解
    • 元注解
  • 复习redis
  • 两道算法题

摆烂了,不想学啦!!!

反射

8.5day06 框架基础--反射+注解_第1张图片
反射主要用来做框架;

学习内容

获取类的各种信息

第一步 加载类,获取类的字节码文件
第二步 获取类的构造器 (对象);
第三步 获取类的成员遍历 Field对象
第四步 获取类的成员方法,Method对象

获取类的字节码文件

1 类名.class 获取反射对象
2 调用Class提供的方法forname
3 通过object类提供的方法 getclass,要先有对象才能调用;

获取反射对象的三种方式

public class Test {
    public static void main(String[] args) throws NoSuchFieldException, ClassNotFoundException {
        //第一种方式
        Class c1=Student.class;
        System.out.println(c1.getName());
//        System.out.println(c1.getSimpleName());
      //  System.out.println(c1.getField(c1.getName()));


        //第二种方式
       Class c2=  Class.forName("反射.Student"); //会有异常,classNotFoundException类找不到异常
        System.out.println(c2.getName());

        //第三种
       
        Student student =new Student();
        Class c3= student.getClass();
        System.out.println(c3.getName());
    }
}

获取类的构造器,并对构造器进行操作
8.5day06 框架基础--反射+注解_第2张图片

public class Test2 {
    public static void main(String[] args) throws NoSuchMethodException {
        Class C= Student.class;
        Constructor[] constructors = C.getConstructors();//构造器封装成数组


        for (Constructor constructor:constructors){
            System.out.println(constructor.getName()+ " 参数个数"+constructor.getParameterCount() );
        }

        Constructor declaredConstructor = C.getDeclaredConstructor();

        Constructor constructor=C.getConstructor(int.class,String.class);
        System.out.println(constructor.getName()+"参数个数"+constructor.getParameterCount());
    }
}

8.5day06 框架基础--反射+注解_第3张图片
获取类的构造器的作用,初始化对象;
8.5day06 框架基础--反射+注解_第4张图片
8.5day06 框架基础--反射+注解_第5张图片在这里插入图片描述

在初始的时候可以指定泛型,后面就可以不用进行强转。
如何构造方法是private修饰的,需要设置setAccessible;

获取类的成员变量
8.5day06 框架基础--反射+注解_第6张图片
8.5day06 框架基础--反射+注解_第7张图片
8.5day06 框架基础--反射+注解_第8张图片
在这里插入图片描述
可以直接使用getName()等,这是为后面学习框架使用的。

获取类的成员方法
8.5day06 框架基础--反射+注解_第9张图片
8.5day06 框架基础--反射+注解_第10张图片
8.5day06 框架基础--反射+注解_第11张图片
8.5day06 框架基础--反射+注解_第12张图片
8.5day06 框架基础--反射+注解_第13张图片

package 反射;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintStream;
import java.lang.reflect.Field;

public class ObjectFrame {
  
    public  static  void saveObject(Object obj) throws Exception {
        PrintStream ps=new PrintStream(new FileOutputStream("src\\data.txt",true));

     Class c=   obj.getClass(); //得到传进来对象的字节码文件
        String cName=c.getSimpleName();
        ps.println("*-*******"+cName+"---------------------");

        Field[] fidlds = c.getDeclaredFields(); //得到的是字段

        for (Field field : fidlds) {
            field.setAccessible(true);//设置暴力访问
            String name = field.getName();//得到对应字段的名称
           String value=field.get(obj)+"";//得到对应字段的值,转为字符串

           ps.println(name+"="+value);

        }
        ps.close();
    }
}

8.5day06 框架基础--反射+注解_第14张图片
通过反射读取信息。

注解

8.5day06 框架基础--反射+注解_第15张图片
在这里插入图片描述
自定义注解
8.5day06 框架基础--反射+注解_第16张图片
8.5day06 框架基础--反射+注解_第17张图片

8.5day06 框架基础--反射+注解_第18张图片

元注解

修饰注解的注解
8.5day06 框架基础--反射+注解_第19张图片
常见的元注解
目标注解,8.5day06 框架基础--反射+注解_第20张图片8.5day06 框架基础--反射+注解_第21张图片
声明注解的周期

注解的解析
判断类上面、方法上面、成员变量上面是否存在注解,并把注解的内容解析出来

8.5day06 框架基础--反射+注解_第22张图片
8.5day06 框架基础--反射+注解_第23张图片
8.5day06 框架基础--反射+注解_第24张图片
注解开发的应用场景

配合反射的技术做框架的;
模拟简易版的junit框架
8.5day06 框架基础--反射+注解_第25张图片

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class Test2 {
    @MyTest
    public  void test1(){
        System.out.println("test1");
    }
    public  void test2(){
        System.out.println("test2");
    }
    public  void test3(){
        System.out.println("test3");
    }
    @MyTest
    public  void test4(){
        System.out.println("test4");
    }

    public static void main(String[] args) throws InvocationTargetException, IllegalAccessException {
        Test2 test2=new Test2();
       //实现启动程序

        Class c= Test2.class;

        Method[] declaredMethods = c.getDeclaredMethods();

        for (Method declaredMethod : declaredMethods) {
            if (declaredMethod.isAnnotationPresent(MyTest.class)){
                declaredMethod.invoke(test2);
            }
        }

    }
}
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyTest {

}

8.5day06 框架基础--反射+注解_第26张图片
注解就是告诉别人需要干什么

复习redis

两道算法题

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