实训笔记6.21

这篇具有很好参考价值的文章主要介绍了实训笔记6.21。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

6.21

一、座右铭

我的故事你说,我的文字我落,我值几两你定,我去何方我挑。

二、知识回顾

2.1 JavaIO流

2.1.1 从三个角度分为六类
  1. 输入流和输出流
  2. 字节流和字符流
  3. 节点流和功能流
2.1.2 IO流的四大抽象基类
四大抽象基类
InputStream
OutputStream
Reader
Writer

InputStream、OutputStream:

所有格式的数据

Reader、Writer:

因为涉及到字符编码的转换,因此只能处理纯文本类型的数据。

2.1.3 IO流的常用类
2.1.3.1 节点流
2.1.3.1.1 数组流:
  1. ByteArrayInputStream
  2. ByteArrayOutputStream
  3. CharArrayReader
  4. CharArrayWriter
2.1.3.1.2 文件流:
  1. FileInputStream
  2. FileOutputStream
  3. FileWriter
  4. FileReader
  5. File文件对象类
2.1.3.2 功能流
2.1.3.2.1 缓冲流:
  1. BufferedInputStream
  2. BufferedOutputStream
  3. BufferedReader
  4. BufferedWriter
2.1.3.2.2 转换流:
  1. InputStreamReader
  2. OutputStreamWriter
2.1.3.2.3 对象流:
  1. ObjectInputStream

  2. ObjectOutputStream

  3. 序列化和反序列化

  4. 两个让Java类具备序列化和反序列化能力的接口

    1. Serializable:static、transient

    2. Externalizable:两个重写方法自己指定哪些需要序列化

      主要就是指定Java中哪些属性值可以被序列化,哪些不能被序列化

    3. 任何一个可以被序列化的类都具备一个序列化版本ID

2.1.3.2.4 打印流:
  1. PrintStream
  2. PrintWriter
2.1.3.2.5 标准输入和标准输出流:
  1. System.in
  2. System.out

2.2 Java注解

注解是给Java程序进行解释说明或者是在Java的编译期间、运行期间提供一些特殊的“服务”

注解的声明

@元注解 访问控制修饰符 @interface 注解名{ 属性类型 属性名() default 默认值; }

元注解–四个

注解名称
@Target
@Retention
@Documented
@Inherited

2.3 注解的应用–Lombok

帮助我们基于注解快速生成一个JavaBean类,借助几个SOURCE声明周期的注解,在Java编译时期将JavaBean有关的内容给我们生成到.class文件当中

注解名称 包含注解
@Data @ToString @Getter @Setter @EqualsAndHashCode
@NoArgsConstructor
@AllArgsConstructor
@Builder

三、Java反射(reflect)机制

反射是在Java运行期间,可以获取类中任何一块组成,以及可以调用或者运行类中任何一块内容

3.1 反射的作用主要有两个:

  1. 运行期间获取类中的任何一种成分:注解、方法、属性、构造器等等
  2. 不用自己手动构建该类对象,也可以调用执行这个类中所有的内容

3.2 反射的核心机制–Class类

Class类是Java中所有类的类。Java中所有的类。都是Class类的一个实例对象

在Java当中,任何一个类一旦加载到JVM内存当中,那么我们就会把这个类创建称为Class类的一个实例对象,然后使用这个类的时候,JVM会通过Class的实例对象去看在这个类当中有没有我们调用的属性和方法。

通过Class类就可以获取任何一个类当中声明的任何一种成分,同时还可以调用这些成

3.3 反射

反射第一步:获取该类的运行时类对象–获取该类的Class实例对象

任何一个类的Class实例对象,我们自己是无法创建的,他们都是在JVM内存加载的时候,由JVM内存自动创建的,在内存中仅且只有一份。因此我们只能获取,不能创建

3.3.1 获取该类的Class实例对象:
  1. 对象名.getClass():Class
  2. 类名.class:Class
  3. Class.forName(“全限定类名”):Class

同一个Class实例

代码示例:文章来源地址https://www.toymoban.com/news/detail-495007.html

		ArrayList<String> list = new ArrayList<>();
		//1、通过某个类的对象名.getClass()方法可以获取该类的class实列对象
		Class < ? extends ArrayList >  class1 = list.getClass();
		//2、通过类名.class去获取该类的运行时类
		Class<ArrayList> class2 = ArrayList. class;
		//3、通过Class.forName(全限定类名)
		Class<?> class3 = Class.forName("java.util.ArrayList");
		System.out.println(class1==class2);//true
		System.out.println(class2==class3);//true
3.3.2 反射的作用一

反射的作用一:通过Class类获取类中的任何一个成分

  1. 获取类中的属性
  2. 获取类中的方法
  3. 获取类中的构造器
  4. 获取类上声明的注解

代码示例

Class<Student> cls = Student.class;
		Field field = cls.getField("phone");
		System.out.println(field.getModifiers());//1
		System.out.println(field.getName());//phone
		System.out.println(field.getType());//class java.lang.String
		
		Field[] fields = cls.getFields();
		
		Field field2 = cls.getDeclaredField("name");
		System.out.println(field2);//private java.lang.String com.sxuek.study.Student.name
		
		Field[] declaredFields = cls.getDeclaredFields();
		for(Field f : declaredFields) {
			System.out.println(f);
			//private java.lang.String com.sxuek.study.Student.name
			//protected java.lang.Integer com.sxuek.study.Student.age
			//java.lang.String com.sxuek.study.Student.sex
			//public java.lang.String com.sxuek.study.Student.phone
		}
Class<Student> cls = Student.class;
		Method[] methods = cls.getDeclaredMethods();
		for(Method method:methods) {
			System.out.println(method.getModifiers());//2
			System.out.println(method.getName());//run
			System.out.println(method.getReturnType());//void
			Parameter[] parameters = method.getParameters();
			for(Parameter p : parameters) {
				System.out.println(p.getType());//4  int  0 void  class java.lang.String  1  int  int  int
				System.out.println(p.getName());//sum call   arg0  diff  arg0  arg1
			}
		}
		
		Constructor<Student> constructor = cls.getConstructor(String.class,Integer.class);
3.3.2 反射的作用二

反射的作用二:通过反射调用类中的成分

  1. 通过反射获取的构造器创建该类的对象
  2. 通过反射获得的属性去设置或者获取属性的值
  3. 通过反射获得的方法去调用方法执行
  4. 通过反射只能获取RUNTIME周期的注解

代码示例:

Class<Student> clz = Student.class;
		Constructor<Student> constructor = clz.getDeclaredConstructor(String.class,Integer.class);
		constructor.setAccessible(true);
		/**
		 * 可以根据获取的构造器创建这个类的对象
		 */
		Student student = constructor.newInstance("zs",20);
		System.out.println(student);//Student [name=zs, age=20, sex=null, phone=null]
		
		Field field = clz.getDeclaredField("name");
		field.setAccessible(true);
		Object object = field.get(student);
		System.out.println(object);//zs
		
		field.set(student,"ls");
		System.out.println(student.getName());//ls
		
		Method method = clz.getDeclaredMethod("diff",int.class,int.class);
		method.setAccessible(true);
		Object value = method.invoke(student, 2,1);
		System.out.println(value);//1
package com.sxuek.study.reflectdemo;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;

public class ObjectGen {
	public static void main(String[] args) {
		Teacher teacher = genObject(Teacher.class);
		System.out.println(teacher);//null
		
		Book book = genObject(Book.class);
		System.out.println(book);//Book(bookName=流浪地球, author=刘慈欣, publisher=淘票票, price=39)
	}
	
	
	public static <T> T genObject(Class<T> cls) {
		//1、获取这个类上声明的注解值--
		MyAnno annotation = cls.getDeclaredAnnotation(MyAnno.class);
		//文件的路径
		String value = annotation.value();
		
		//2、根据IO流读取文件数据获取配置项的值
		Map<String, Object> map = new HashMap<>();
		BufferedReader br = null;
		try {
			br = new BufferedReader(new FileReader(value));
			String line = null;
			while((line = br.readLine()) != null) {
				String[] array = line.split("=");
				map.put(array[0], array[1]);
			}
			//3、根据反射获取类中构造器,构建对象
//			T newInstance = cls.newInstance();//调用的是无参构造器 无参构造器必须存在,而且必须是public
			Constructor<T> constructor = cls.getDeclaredConstructor();
			constructor.setAccessible(true);
			T t = constructor.newInstance();
			//4、根据反射去获取类中的属性,然后结合构建的对象以及读取的文件中的数据给对应的属性赋值
			Field[] fields = cls.getDeclaredFields();
			for(Field f : fields) {
				//5、属性赋值时 读取属性上的注解值,然后根据属性的注解值去配置文件获取对应的值给属性赋值
				MyAnno anno = f.getDeclaredAnnotation(MyAnno.class);
				String value2 = anno.value();
				f.setAccessible(true);
				f.set(t, map.get(value2));
			}
			return t;
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			if(br != null) {
				try {
					br.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
		return null;
	}
}

到了这里,关于实训笔记6.21的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 实训笔记6.6

    我的故事你说,我的文字我落,我值几两你定,我去何方我挑。 1、方法和构造方法 1.1 Java方法 方法的声明和调用方式 方法的分类 方法的返回值问题 方法名 方法的形参列表问题 方法的重载问题 方法的JVM内存问题(方法的声明时机、方法的调用内存) 方法和方法之间可以相

    2024年02月08日
    浏览(34)
  • 粤嵌实训笔记二

    1、在Linux下,使用 gcc 来编译 gcc xxx.c -- 默认生成的可执行文件 名为 a.out gcc xxx.c -o xx -- 生成指定名字的可执行文件 xx 2、交叉编译 :在一个环境下编译生成 适用于 另一个环境下的可执行文件 3、为交叉编译工具创建软连接 sudo ln -s /usr/lib/x86_64-linux-gnu/libmpfr.so.6 /usr/lib/x86_64-

    2024年02月03日
    浏览(40)
  • 实训笔记7.24

    1.1 涉及到一些框架核心组件 1.1.1 InputFotmat 1.1.2 MapTask 1.1. 3Partitioner 1.1.4 WritableComparable 1.1.5 Combiner(可选) 1.1.6 WritableComparator(GroupingComparator) 1.1.7 ReduceTask 1.1.8 OutputFormat SequenceFile文件是Hadoop提供的一种比较的特殊的文件,文件中存储的是key-value的二进制数据,而且SequenceFile文

    2024年02月16日
    浏览(36)
  • 实训笔记7.19

    我的故事你说,我的文字我落,我值几两你定,我去何方我挑。 2.1 HDFS上传数据的流程 2.2 HDFS下载数据的流程 2.1~2.2:客户端Client 主节点NameNode 从节点DataNode 2.3 HDFS中NameNode和SecondaryNameNode工作机制(涉及到HDFS的元数据管理操作) 一个概念和两个文件:元数据、edits编辑日志文

    2024年02月16日
    浏览(34)
  • 实训笔记8.22

    1.1 DDL 1.1.1 Hive中数据表的分类问题 Hive中数据表的分类只是用来告诉我们Hive底层在HDFS上存储的文件的规则和规范 1.1.2 特殊的数据类型 array、map、struct Hive数据表可以指定底层的存储格式的分隔符问题row format 1.2 DML Hive中默认不支持批量的删除和更新操作 增加数据 装载数据 追

    2024年02月11日
    浏览(33)
  • 实训笔记6.26

    我的故事你说,我的文字我落,我值几两你定,我去何方我挑。 2.1 Java多线程 2.1.1 一些概念知识 程序、进程、线程 单核CPU和多核CPU 并行和并发 2.1.2 多线程的创建方式 继承Thread类,重写run方法 实现Runnable接口,重写run方法 实现Callable接口,重写call方法 使用线程池 缓存线程

    2024年02月11日
    浏览(35)
  • 实训笔记9.4

    git官网 1.1 建立仓库 git init 1.2 添加到暂存区 git add 文件名称 git add . 1.3 提交到历史区 git commit -m \\\"提交信息\\\" 1.4 查看 1.4.1 查看当前版本库状态 git status 1.4.2 查看版本日志信息 git log git log --oneline 单行模式 git log --oneline --graph ——单行带图形 1.4.3 查看版本的变更历史 git reflog

    2024年02月09日
    浏览(34)
  • 实训笔记8.25

    将海量的数据通过某种技术采集到大数据环境中进行存储和管理,为后期的大数据处理分析做准备 常见的数据:网站/软件的运行日志、记录的日志,软件的结构化数据、爬虫数据、传感器采集数据… Flume是apache开源的顶尖项目,专门是采集和聚合海量的日志数据。但是随着

    2024年02月11日
    浏览(36)
  • 实训笔记8.29

    1.1 项目的预备知识 1.1.1 电商平台 1.1.2 用户行为数据 访客的用户信息 访客的终端信息 请求网址信息 请求来源信息 请求的产品信息 1.1.3 常见的软件/网站的组成和技术实现 前端 后端 数据库 1.1.4 大数据中数据计算场景 离线计算 实时计算 图计算 算法挖掘推荐等等 1.2 项目的

    2024年02月10日
    浏览(37)
  • 实训笔记7.7

    我的故事你说,我的文字我落,我值几两你定,我去何方我挑。 2.1 使用ssh远程连接协议进行连接 2.2 ssh使用有两种方式 使用命令来连接 ssh 用户名@ip 使用一些软件来连接 xshell finalshell 3.1 查看当前工作目录 pwd 3.2 切换工作目录的命令 cd 路径(绝对路径/相对路径) Linux的目录

    2024年02月13日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包