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

本文详细介绍了Java反射的基本概念,包括如何获取类的字节码文件、构造器的操作、成员变量和方法的获取,以及自定义注解和元注解的使用。通过实例展示了如何利用反射模拟简易Junit框架。最后,还提及了注解在Redis和框架开发中的应用场景。
摘要由CSDN通过智能技术生成

摆烂了,不想学啦!!!

反射

在这里插入图片描述
反射主要用来做框架;

学习内容

获取类的各种信息

第一步 加载类,获取类的字节码文件
第二步 获取类的构造器 (对象);
第三步 获取类的成员遍历 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());
    }
}

获取类的构造器,并对构造器进行操作
在这里插入图片描述

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());
    }
}

在这里插入图片描述
获取类的构造器的作用,初始化对象;
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

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

获取类的成员变量
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
可以直接使用getName()等,这是为后面学习框架使用的。

获取类的成员方法
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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();
    }
}

在这里插入图片描述
通过反射读取信息。

注解

在这里插入图片描述
在这里插入图片描述
自定义注解
在这里插入图片描述
在这里插入图片描述

元注解

修饰注解的注解
在这里插入图片描述
常见的元注解
目标注解,在这里插入图片描述在这里插入图片描述
声明注解的周期

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

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
注解开发的应用场景

配合反射的技术做框架的;
模拟简易版的junit框架
在这里插入图片描述

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 {

}

在这里插入图片描述
注解就是告诉别人需要干什么

复习redis

两道算法题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

全栈阿星

您的支持是我最大的动力

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

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

打赏作者

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

抵扣说明:

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

余额充值