【Java 核心笔记】04.07. 反射

能够分析类能力的程序称为反射(reflective),其可以: 在运行中分析类 在运行中查看对象 编写泛型数组代码 调用任意方法 java.lang.Class 类用于描述 JVM 中使用的类。 在运行中分析类 java.lang.reflect中三个重要的类Field、Method、Constructor分别用于描述类的域、方法、构造器。 Class类对象的 getFields、getMethods、getConstructors方法将分别返回类提供的public 域、方法和构造器数组(包含超类的公有成员) getDeclaredFields、getDeclaredMethods、getDeclaredConstructors方法将分别返回类中声明的全部域、方法和构造器数组(但不包含超类的成员)。 在运行中分析对象 在获取Field对象后,通过其get方法,可以得到某个对象该字段的值。 直接访问私有域,get方法会抛出IllegalAccessException异常。但如果一个Java程序没有受到安全管理器的控制,就可以通过Field对象的setAccessible方法覆盖访问控制(Method、Constructor同理)。 通过get方法得到的是Object。如果字段为基本类型,会将其打包为包装类型,并以Object形式返回。 通过set方法可以修改字段的值。 编写泛型数组代码 将一个 Employee[] 临时地转换成 Object[] 数组, 然后再把它转换回来是可以的, 但最开始就是 Object[] 的数组却永远不能转换成 Employe[] 数组。(但可以进行单个元素的转换) Employee[] employees = new Employee[10]; Object[] objects = employees; System.out.println((Employee[]) objects); // 可以转换 objects = new Object[10]; System.out.println((Employee[]) objects); // java.lang.ClassCastException 以下是利用反射实现任意类型数组拷贝的例子: private static Object goodCopyOf(Object array, int newLength) { Objects....

October 14, 2017 · Zi WANG

【Java 核心笔记】04.06. UML、类的一些要点补充

类间关系 依赖(dependence)(uses-a):例如Order对象使用Account对象查看账户的信用状态 聚合(aggregation)(has-a):例如Order对象包含了一些Item对象 继承(inheritance)(is-a) 对应的 UML 符号 有些方法学家不喜欢聚合这个概念,而更加喜欢「关联(association)」这个术语。但「has-a」更加形象,同时「关联」的 UML 符号不易区分。 以下是一个UML类图的示例: 类的一些要点补充 使用类的方法时,会隐式包含一个参数——方法名前的类对象(方法之中使用this调用),这被称为隐式(implicit)参数。其他参数称为显式(explicit)参数。 方法接收参数的形式是按值调用(call by value)。 可以通过「方法的签名(signature)」来完整地描述一个方法(方法名+参数类型,不包含返回类型),例如String类的indexOf方法 indexOf(int) indexOf(int, int) indexOf(String) indexOf(String, int) 默认域的初始化 如果没有初始化类中的域,将会被自动初始化为默认值(0、false或null)。 但局部变量不可,必须明确地初始化方法中的局部变量。 类中代码执行顺序原则: 静态优先(静态域、静态代码块) 对于非静态,顺序为:域(初始化语句)、构造代码块(初始化块)、构造方法 总结:父类静态元素 -> 子类静态元素 -> 父类非静态元素 -> 子类非静态元素 装箱和拆箱是编译器认可的,而不是虚拟机。编译器在生成类的字节码时,插入必要的方法调用。虚拟机只是执行这些字节码。 包 从编译器的角度来看,嵌套的包之间没有任何关系。 import java.time.* 对代码的大小无负面影响,但会降低人可读性。 只能使用星号(*)导入 一个 包,而不能使用import java.*或import java.*.*导入以java为前缀的所有包。 在包中定位类是编译器的工作,字节码中使用完整的包名引用其他类。 import static java....

October 14, 2017 · Zi WANG

【Java 核心笔记】04.05. 内部类

在类的内部还可以定义另一个类。如果在类 Outter 的内部再定义一个类 Inner ,此时类 Inner 就称为内部类,而类 Outter 则称为外部类。 内部类可声明为 public 或 private。当内部类声明为 public 或 private 时,对其访问的限制与成员变量和成员方法完全相同。 class Outer { // 定义外部类 private String info = "hello world"; // 定义外部类的私有属性 class Inner { // 定义内部类 public void print(){ // 定义内部类的方法 System.out.println(info); // 直接访问外部类的私有属性 } } public void fun() { // 定义外部类的方法 new Inner().print(); // 通过内部类的实例化对象调用方法 } } public class InnerClassDemo01 { public static void main(String args[]){ new Outer()....

October 14, 2017 · Zi WANG

【Java 核心笔记】04.04. 代码块

代码块就是使用 {} 括起来的一段代码,根据位置不同,可分为四类: 普通代码块 构造代码块 静态代码块 同步代码块 普通代码块 直接定义在方法中的代码块称为普通代码块。 public class Demo { public static void main(String args[]) { { // 普通代码块 int x = 30; // 属于局部变量 System.out.println("普通代码块 --> x = " + x); } int x = 100; // 与局部变量名称相同 System.out.println("代码块之外 --> x = " + x); } } // 输出 // 普通代码块 --> x = 30 // 代码块之外 --> x = 100 构造代码块 直接在类中定义的代码块,称为构造块。...

October 14, 2017 · Zi WANG

scp 命令简明介绍

安全复制(英语:Secure copy,缩写SCP)是指在本地主机与远程主机或者两台远程主机之间基于Secure Shell(SSH)协议安全地传输电脑文件。“SCP”通常指安全复制协议或者程序本身。安全复制 - 维基百科,自由的百科全书 其使用方法类似于 cp 命令。 复制文件或目录命令: 复制文件: 将本地文件拷贝到远程 scp 文件名 --用户名@计算机IP或者计算机名称:远程路径 从远程将文件拷回本地 scp --用户名@计算机IP或者计算机名称:文件名 本地路径 复制目录: 将本地目录拷贝到远程 scp -r 目录名 用户名@计算机IP或者计算机名称:远程路径 从远程将目录拷回本地 scp -r 用户名@计算机IP或者计算机名称:目录名 本地路径 注意,如果远程主机使用非默认端口22,可以在命令中指定。例如,从远程主机复制一个文件到本地。 scp -P 2222 user@host:directory/SourceFile TargetFile

October 11, 2017 · Zi WANG

《鸟哥的Linux私房菜》笔记——04. 简单命令行

键入命令 [zill@hiwangzi.com ~]$ command [-options] parameter1 parameter2 ... 指令 选项 参数(1) 参数(2) 注意:有时也可以使用 + 放置于选项或参数之前 例如: zill@zill-pc:~$ date +%Y/%m/%d 2017/10/09 zill@zill-pc:~$ date +%H:%M 17:32 几个程序 显示日期与时间的指令: date 显示日历的指令: cal 简单好用的计算器: bc(进入交互界面后 scale=number 设置小数点位数) 几个按键 [Tab]:主要用于自动补全 [Ctrl]-c:中断当前程序 [Ctrl]-d:通常代表「键盘输入结束(End Of File, EOF 或 End Of Input)」的意思(可以代替手动输入 exit) [Shift]+{[PageUP]|[Page Down]}:向前翻页|向后翻页 关于帮助文档 1. man 表格的第一行,可以看到「DATE(1)」,其中(1)代表「一般使用者可以使用的指令」。 常见代号及含义(可以通过 man man 获得更详细的说明): 代号 代表内容 1 使用者在shell环境中可以操作的指令 2 系统核心可调用的函数与工具等 3 一些常用的函數(function)与函数库(library),大部分为C的函数库(libc) 4 硬件的说明,通常在/dev下的文件 5 设置文件或者是某些文件的格式 6 游戏(games) 7 惯例与协定,例如Linux文件系统、网络协议、ASCII code等等的说明 8 系统管理员可以使用的管理指令 9 跟kernel有关的文件 可以使用 man -f 指令 查找相关指令(名称完全相同)。 可以使用 man -k 指令 搜索相关指令。...

October 9, 2017 · Zi WANG

《鸟哥的Linux私房菜》笔记——03. 磁盘分区

Everything is a file. 常见硬件对应于 Linux 下的文件(/dev目录下) 装置 装置在Linux内的档名 SCSI/SATA/U盘硬盘机 /dev/sd[a-p] U盘 /dev/sd[a-p](与SATA相同) VirtI/O界面 /dev/vd[a-p](用于虚拟机内) 软盘机 /dev/fd[0-1] 打印机 25针: /dev/lp[0-2]; USB: /dev/usb/lp[0-15] 鼠标 PS2: /dev/psaux; USB: /dev/usb/mouse[0-15] CDROM/DVDROM /dev/scd[0-1](通用); /dev/sr[0-1](通用,CentOS较常见) 当前CDROM/DVDROM /dev/cdrom 当前的鼠标 /dev/mouse 磁带机 IDE: /dev/ht0; SATA/SCSI: /dev/st0 IDE硬盘机 /dev/hd[a-d](近乎被淘汰) MBR 分区方式 硬盘的第一个扇区主要记录了两个重要的信息,分别是:...

October 9, 2017 · Zi WANG

【Java 核心笔记】04.03. 匿名对象与字符串缓冲池

匿名对象 匿名对象:只在堆内存中开辟空间,不存在栈内存的引用。 由于匿名对象没有对应的栈内存引用所指向,所以使用一次之后,就等待被垃圾回收了。 例:一个单独的字符串就是一个 String 的匿名对象。System.out.println("Hi"); 字符串缓冲池 public class Test { public static void main(String[] args) { String str = "hello" ; System.out.println("hello".equals(str)) ; // true System.out.println("hello" == str); // true // String 池:Java为了优化字符串操作 提供了一个缓冲池; // str 指向字符串 “hello” ,第二句中字符串 “hello” ,因为字符串在常量池中已经存在,第二句中字符串 “hello” 就不再开辟空间。 // 所以不管是 equals 比较内容, == 比较内存地址都为 true // 但请不要使用这种方式比较字符串,不稳键 } } 下面的代码验证了我去「XXXX」面试时真的是乱吹🙈: /* * 当时我以为 JVM 的缓冲池可以实现“变量(a)连接字符串("b")可以与"ab"使用同一个堆内存” * 但是事实是并不可行 */ public class StringTest{ public static void main(String [] args){ String ab="ab"; String a="a"; // 「变量」与「变量连接字符串(匿名对象)」比较 System....

October 7, 2017 · Zi WANG