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

news/2024/11/8 18:43:30/

文章目录

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

摆烂了,不想学啦!!!

反射

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

学习内容

获取类的各种信息

第一步 加载类,获取类的字节码文件
第二步 获取类的构造器 (对象);
第三步 获取类的成员遍历 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 {@MyTestpublic  void test1(){System.out.println("test1");}public  void test2(){System.out.println("test2");}public  void test3(){System.out.println("test3");}@MyTestpublic  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

两道算法题


http://www.ppmy.cn/news/1007873.html

相关文章

uni-app:实现列表单选功能

效果图&#xff1a; 核心解析&#xff1a; 一、 <view class"item_all" v-for"(item, index) in info" :key"index"><view classposition parameter-info text-over :classitem.checked?"checked_parameter":""…

在线课堂,视频点播,springboo+vue

springbootvue三端&#xff08;管理后台&#xff0c;教师端&#xff0c;用户端&#xff09;端可提供源码&#xff0c;可远程安装&#xff0c;需要的加微信&#xff1a; 体验地址&#xff1a;http://edu.dgrxs.com/ 用户端&#xff1a; 管理端&#xff1a; 教师端&#xff1a;

23款奔驰GLE450加装迈巴赫GLS600同款电动踏板,家人上下车更方便

新款奔驰GLE级车型原厂都没有电动踏板&#xff0c;都是固定踏板&#xff0c;或者没有踏板。这次安装的迈巴赫款式电动踏板是副厂的&#xff0c;虽然是副厂&#xff0c;但是脚下面积大&#xff0c;外观整洁大气&#xff0c;非常适合GLE。

SpringCloud深度学习(在更)

微服务简介 微服务是什么&#xff1f; 微服务是一种架构风格&#xff0c;将一个大型应用程序拆分为一组小型、自治的服务。每个服务都运行在自己独立的进程中&#xff0c;使用轻量级的通信机制&#xff08;通常是HTTP或消息队列&#xff09;进行相互之间的通信。这种方式使得…

linux监控java进程的cpu和线程快照脚本

java进程的cpu和线程快照一般都会接入监控平台进行监控和查看&#xff0c;也可以通过命令在服务器查看&#xff1a;top -b -n 1 -Hp pid > 1.top && jstack pid > 1.stack&#xff0c;当然也可以通过shell脚本的方式将cpu和jstack指标记录输出到文件。 #每隔5秒…

python入门常用操作

python常用操作 1、ndarry数组的切片2、print用法2.1格式化输出format2.2字符串格式化输出 3、均值滤波函数 1、ndarry数组的切片 例如一个5列的ndarry数组&#xff0c;想要获取第2列和第3列数据&#xff0c;可以用 #&#xff08;1&#xff09;用法1 data[:,1:3]&#xff0c;…

dijkstra算法相关(使用邻接表和优先队列两种方法)力扣题:743. 网络延迟时间(有向图);1334. 阈值距离内邻居最少的城市(无向图)

具体dijkstra算法就不展开说了&#xff0c;因为太多帖子来解释了&#xff0c;并且这也只是我的个人总结/记录&#xff0c;我会把自己的思考过程写在代码的注释中。 743. 网络延迟时间&#xff08;有向图&#xff09; 有 n 个网络节点&#xff0c;标记为 1 到 n。 给你一个列…

java多线程并发面试题总结(史上最全40道)

1、多线程有什么用&#xff1f; 一个可能在很多人看来很扯淡的一个问题&#xff1a;我会用多线程就好了&#xff0c;还管它有什么用&#xff1f;在我看来&#xff0c;这个回答更扯淡。所谓"知其然知其所以然"&#xff0c;"会用"只是"知其然"&am…