myeclipse的安装和使用
debug调试模式
使用这种模式,调试程序(看到程序里面数据的变化)
- 使用debug第一步需要设置一个断点
- 使用debug as方式,运行程序
- 可以让程序向下执行
- 使用step over F6(单步执行)
- resume F8 表示调试结束,直接向下运行
- 当还有下个断点,会跳到下个断点
- debug另外一个用途:查看程序的源代码
- step into F7 进入到方法
- step return 返回
myeclipse的快捷键
public class TestDemo4 {
public static void main(String[] args) {
// 代码提示 alt+/
// 代码修复 ctrl+1
// ctrl+shift+o
List list = new ArrayList();
// 单行注释 ctrl+/
// 取消单行注释 ctrl+/
// int sum = 0;
// 多行注释 ctrl+shift+/
// 取消多行注释 ctrl+shift+\
int a = 1;
int b = 2;
// 删除行 ctrl+d
// 代码的格式化 ctrl+shift+f
}
}
junit的使用
- 单元测试
- 测试对象是一个类中的方法
- junit不是javase的一部分,需要导入jar包,myeclipse自带junit
- junit版本 3.x 4.x
- 单元测试方法的方法命名规则 public void 方法名() {}
- 使用注解方式运行测试方法,在方法上面
- @Test 表示进行单元测试
- 右键方法名 点击run as => junit test
- @Ignore 表示这个方法不进行单元测试
- @Before 在每个方法之前运行
- @After 在每个方法之后运行
- 断言(了解)
- @Test 表示进行单元测试
jdk5.0新特性
- 泛型、枚举、静态导入、自动拆装箱、增强for、可变参数
- 反射
泛型的简介
为什么要使用泛型?一般使用在集合上,防止类型转换错误
泛型使用在方法上
- 定义一个数组,实现指定位置上数组元素的交换
- 方法逻辑相同,只是数据类型不同,这个时候使用泛型方法
- 使用泛型方法,需要定义一个类型,使用大写字符表示
T
:表示任意的类型 - 写在返回值之前
<T>
- 表示定义了一个类型,这个类型是T,然后在下面就可以使用这个类型了
泛型在类上的使用(了解)
在一个类上定义一个类型,这个类型可以在类里面直接使用,但这个类型不能在静态方法上使用。
枚举的简介
枚举的api的操作
- name():返回枚举的名称
- ordinal():枚举的下标
- valueof(Class enumClass, String name):得到枚举的对象
- 不在api但编译时生成的两个方法
- valueof(String name):转换枚举对象
- values():获取所有枚举对象数组
静态导入
可以在代码里面直接使用静态导入方式,导入静态方法或常量。
import static xxx.xxx.xxx;
自动拆装箱
- 装箱
- 把基本的数据类型转换成包装类
- 拆箱
- 把包装类转化成基本的数据类型
增强for循环
- 使用场景:数组;实现Iterable接口的集合 可以使用增强for循环
- 出现目的:为了替代迭代器
- 增强for底层就是迭代器
内容补充
泛型擦除:首先泛型只是出现在源代码阶段,当编译之后泛型不存在了。
可变参数
可变参数的定义方法 数据类型…数组的名称
反射的原理
应用在一些通用性比较高的代码中,在后面学到的框架,大多数都是使用反射来实现的。
在框架开发中,都是基于配置文件开发。
在配置文件中配置了类,可以通过反射得到类中的所有内容,可以让类中的某个方法来执行。
类中的所有内容:属性、没有参数的构造方法、有参数的构造方法、普通方法。
- 反射的原理
- 首先需要把java文件保存到本地硬盘 .java
- .java文件编译成.class文件
- 使用jvm把.class文件通过类加载器加载到内存中
- .class文件在内存中使用Class类表示
- 当使用反射时,首先需要获取到Class类,得到了这个类之后,就可以得到class文件里的所有内容:包括属性、构造方法、普通方法。
- 属性用Field表示
- 构造方法用Constructor表示
- 普通方法用Method表示
// 首先要获取Class类
// 获取Class类
Class clazz1 = Person.class;
Class clazz2 = new Person().getClass();
Class clazz3 = Class.forName("cn.itcast.test09.Person");
使用反射操作无参数的构造方法
// 操作无参数的构造方法
@Test
public void test1() throws Exception {
// 得到Class
Class c1 = Class.forName("cn.itcast.test09.Person");
// 得到Person类的实例
Person p = (Person) c1.newInstance();
// 设置值
p.setName("zhangsan");
System.out.println(p.getName());
}
使用反射操作有参数的构造方法
// 操作有参数的构造方法
@Test
public void test2() throws Exception {
// 得到Class
Class c2 = Class.forName("cn.itcast.test09.Person");
// 使用有参数的构造方法
// c1.getConstructors(); // 获取所有的构造方法
// 传递是有参数的构造方法里面参数类型,类型使用class形式传递
Constructor cs = c2.getConstructor(String.class, String.class);
// 通过有参数的方法构造方法设置值
// 通过有参数的方法构造方法创建Person实例
Person p1 = (Person) cs.newInstance("lisi", "100");
System.out.println(p1.getId() + " " + p1.getName());
}
使用反射操作属性
// 操作name属性
@Test
public void test3() throws Exception {
// 得到Class
Class c3 = Class.forName("cn.itcast.test09.Person");
// 得到Person类的实例
Person p = (Person) c3.newInstance();
// 得到name属性
// c3.getDeclaredMethods();// 得到所有属性
// 通过属性的名称获取属性
Field f1 = c3.getDeclaredField("name");
// 私有属性需要设置可以操作私有属性
f1.setAccessible(true);
// 设置name值
f1.set(p, "wangwu"); // 相当于p.nmae="wangwu"
System.out.println(f1.get(p)); // 相当于p.name
}
使用反射操作普通方法
// 操作普通方法
@Test
public void test4() throws Exception {
// 得到Class
Class c4 = Class.forName("cn.itcast.test09.Person");
// 得到Person类的实例
Person p = (Person) c4.newInstance();
// 得到普通方法
// c4.getMethods();// 得到所有的普通方法
Method m1 = c4.getDeclaredMethod("setName", String.class);
// 操作的是私有方法
// m1.setAccessible(true);
// 让setName方法执行,执行设置值
m1.invoke(p, "zhangsan");
System.out.println(p.getName());
}
当操作的方法是静态的方法:method.invoke(null, paramArgs);