java学习笔记(16) - 反射
反射
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
要想解剖一个类,必须先要获取到该类的字节码文件对象。而解剖使用的就是Class类中的方法.所以先要获取到每一个字节码文件对应的Class类型的对象.
反射就是把java类中的各种成分映射成一个个的Java对象
例如:一个类有:成员变量、方法、构造方法、包等等信息,利用反射技术可以对一个类进行解剖,把个个组成部分映射成一个个对象。
反射机制有什么用?
运行时动态获取类的信息:在编写代码时,对于类的信息是必须在编译时确定的,但在运行时,有时需要根据某些条件,动态获取某个类的信息,这时就可以使用Java中的反射机制。
动态生成对象:反射机制可以在运行时生成对象,这样就可以根据参数的不同,动态的创建不同的类的实例对象。
动态调用方法:通过反射机制可以调用类中的方法,不论这些方法是否是公共的,也不论这些方法的参数个数和类型是什么,反射机制都具有这样的能力。
动态修改属性: ...
java学习笔记(15) - 进程与线程(2)
线程休眠以及同步
所谓线程休眠就是给线程加入一个定时器,让线程延迟进入可运行状态,延迟时间到达后在通过抢占进程资源来运行线程操作,具体代码如下:
// wait 和 sleeppackage chapter09;public class Java03_Thread { public static void main(String[] args) throws Exception { // TODO 线程 - 休眠sleep // 休眠1秒钟 - 循环执行打印语句 while (true) { Thread.sleep(1000); System.out.println("main线程执行完毕"); } }}
下面是常用的同步操作结合线程休眠操作(synchronized+wait+notify/notifyAll)
下面是一个业务场景,我们去银行办理业务通常是需要拿号排队的,银行9点开门 ...
java学习笔记(14) - 进程与线程(1)
进程
进程(process) 是计算机中程序的一次运行活动,是系统进行资源分配和调度的基本单位(是程序的一次执行过程,是系统运行程序的基本单位),是操作系统结构的基础。进程可以视为程序的一个实例。大部分程序可以同时运行多个实例进程(例如记事本、画图、浏览器等),也有的程序只能启动一个实例进程(例如网易云音乐、360 安全卫士等)
线程
线程是进程的一个实体,是CPU调度和分派的基本单位,他是比进程更小的能独立运行的基本单位,线程自己基本上不拥有系统资源。(拥有自己的栈),线程好比做工厂里面的流水线,如果一个工厂里面只有一条流水线,那么这个工厂的效率就必然会非常的底下,如果由多条流水线那么这个工厂的效率就会非常的高,这就是多线程的意义所在
线程和进程的关系:
一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程(通常说的主线程)。
系统将资源分配给进程,同一进程的所有线程共享该进程的所有资源。
线程在执行过程中,需要协作同步(生产者消费者)。不同进程的线程间要利用消息通信的办法实现同步。
CPU是分给线程,即真正在CPU上运行的是线程。
创建线程packag ...
java学习笔记(13) - IO文件操作流
IO文件流学习创建文件,文件夹,获取文件数据,对象package Chapter07;// JAVA的标准库java.io提供了File对象来操作文件和目录。import java.io.File;public class Stream01 { public static void main(String[] args) throws Exception{ // TODO Java IO - 文件流 // TODO File : 文件类型(文件,文件夹),属于java.io // 创建文件对象, 使用文件路径关联系统文件 String filePath = "C:\\Users\\28902\\Desktop\\javas-speedLearn\\Data"; File file = new File(filePath); System.out.println(file); // 文件对象的操作// // TODO 判断当前文件对 ...
java学习笔记(12) - 集合(3)
集合的介绍(3)Map
Map是一个集合,一种依照键(key)存储元素的容器,键(key)很像下标,在List中下标是整数。在Map中键(key)可以是任意类型的对象。Map中不能有重复的键(Key),每个键(key)都有一个对应的值(value)。
Map接口的常用子类有如下四个:HashMap、HashTable、TreeMap、ConcurrentHashMap等…下面就展示HashMap以及HashTable
HashMap例子展示package chapter06;import java.util.HashMap;public class Collection_HashMap { public static void main(String[] args) throws Exception { // TODO 集合 - Map - 以键值对的形式存储数据(key,value) // HashMap : Hash + Map // 数据存储是无序且不重复的 HashMap map = new ...
java学习笔记(11) - 集合(2)
集合的介绍(2)Set
Set是Java中的集合类,是一个继承自Collection接口,提供了一种无顺序,不重复的集合。常用的子类包括HashSet, TreeSet(不能填入null)等。
// 下面举 HashSet 为例子:package chapter06;import java.util.ArrayList;import java.util.HashSet;public class Collection_HashSet { public static void main(String[] args) { // TODO 集合 - Collection - Set(底层是 数组 + 链表) // HashSet : Hash + Set // Hash : 哈希算法,散列算法 - 导致生成的set是一个无序且不重复的数组 // ArrayList : 数组 // LinkedList : HashSet set = new HashSet(); // ...
java学习笔记(10) - 集合(1)
java学习笔记(8) - 面向对象(8) : 集合
集合的介绍// TODO 集合// 生活中也有集合的概念。是一个动词// Java中的集合是一个名词,数据的一种容器,用于容纳数据// Java提供了完整的集合框架// TODO 问题:什么时候需要一个容纳数据的容器,也就是集合对象?// Java集合框架中就包含了对不确定个数的数据处理的集合类// TODO 问题:如果只是为了容纳数据,可以是直接使用数组,为什么要学习集合?// 数组使用起来不方便。在数据个数不确定的场合,数组使用起来不是很方便// TODO 总结:对不确定的有关系的数据进行相同的逻辑处理的场合,使用集合是一个不错的选择// TODO 根据数据的不同,Java的集合分为2大体系:// 1. 单一数据体系 : Collection接口定义了相关的规则// 2. 成对出现的数据体系 : Map接口定义了相关的规则// 所谓的成对的数据,就是2个数据有关系,可以根据第一个数据关联到第二个数据// 也称之为键值对数据 ,(123123[身份证], zhangsan[人名 ...
java学习笔记(9) - 泛型介绍(2)
泛型(2) - 泛型方法 , 泛型通配符泛型方法
当在一个方法签名中的返回值前面声明了一个 < T > 时,该方法就被声明为一个泛型方法。< T >表明该方法声明了一个类型参数 T,并且这个类型参数 T 只能在该方法中使用。当然,泛型方法中也可以使用泛型类中定义的泛型参数。
public <类型参数> 返回类型 方法名(类型参数 变量名) { ...}
只有在方法签名中声明了< T >的方法才是泛型方法,仅使用了泛型类定义的类型参数的方法并不是泛型方法。
public class Test<U> { // 该方法只是使用了泛型类定义的类型参数,不是泛型方法 public void testMethod(U u){ System.out.println(u); } // <T> 真正声明了下面的方法是一个泛型方法 public <T> T testMethod1(T t){ return t; }}
泛 ...
java学习笔记(8) - 泛型介绍(1)
泛型(1) - 泛型类 , 泛型接口什么是泛型?为什么需要泛型?
泛型,即“参数化类型”。一提到参数,最熟悉的就是定义方法时有形参列表,普通方法的形参列表中,每个形参的数据类型是确定的,而变量是一个参数。在调用普通方法时需要传入对应形参数据类型的变量(实参),若传入的实参与形参定义的数据类型不匹配,则会报错。
那参数化类型是什么?以方法的定义为例,在方法定义时,将方法签名中的形参的数据类型也设置为参数(也可称之为类型参数),在调用该方法时再从外部传入一个具体的数据类型和变量。
泛型使用场景在 ArrayList 集合中,可以放入所有类型的对象,假设现在需要一个只存储了 String 类型对象的 ArrayList 集合。
@ Testpublic void test() { ArrayList list = new ArrayList(); list.add("aaa"); list.add("bbb"); list.add("ccc"); for (int i = 0; i &l ...
java学习笔记(7) - 面向对象(7):异常
异常为什么要用都异常
Java中的异常(Exception)英文单词是例外的意思(学英语),如果不处理异常,将会导致软件异常中断,崩溃,退出,严重影响用户的使用和体验。如果合理的应用异常处理那将会减少软件出现的错误,可以友好的提示用户,提升用户的体验。
异常是什么?
异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的。如:用户输入非法数据,做除法运算的时候除数为0,打开的文件不存在,网络中断,死递归,死循环导致栈溢出等。
异常机制的概述
异常机制是指当程序出现错误后,程序如何处理。具体来说,异常机制提供了程序退出的安全通道。当出现错误后,程序执行的流程发生改变,程序的控制权转移到异常处理器。
程序错误分为三种:1.编译错误;2.运行时错误;3.逻辑错误。
编译错误(Exception)是因为程序没有遵循语法规则,编译程序能够自己发现并且提示我们错误的原因和位置,这个也是大家在刚接触编程语言最常遇到的问题。
运行时错误(RuntimeException)是因为程序在执行时,运行环境发现了不能执行的操作。
逻辑错误是因为程序没有按照预期的逻辑顺序执行。异常也 ...