1. 反射的原理
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
-
应用在一些通用性比较高的代码中
-
后面学到的框架,大多数都是使用反射来实现的
-
在框架开发中,都是基于配置文件开发
-
在配置文件中配置了类,可以通过反射得到类中的所有内容,可以让类中的某个方法来执行
-
类中的所有内容:属性、没有参数的构造方法、有参数的构造方法、普通方法
画图分析反射的原理
-
首先需要把java文件保存到本地硬盘 .java
-
编译java文件,成.class文件
-
使用jvm,把class文件通过类加载加载到内存中
-
万事万物都是对象,class文件在内存中使用Class类表示
当使用反射时候,首先需要获取到Class类,得到了这个类之后,就可以得到class文件里面的所有内容,包含属性、构造方法和普通方法。
2. 使用反射操作类里面的无参构造方法
public class Student {
private String name;
private int age;
public Student() {
super();
}
public Student(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public void show() {
System.out.println("show");
}
public void method(int x, int y) {
System.out.println(x + "method" + y);
}
}
测试类:
@Test
public void test1() throws Exception {
// 得到Class
Class clazz = Class.forName("com.yfy.Student");
// 获取无参构造方法
Student s = (Student) clazz.newInstance();
s.setName("张三");
s.setAge(20);
System.out.println(s.getName() + "--" + s.getAge());
}
3. 使用反射操作有参数的构造方法
@Test
public void test2() throws Exception {
// 得到Class
Class clazz = Class.forName("com.yfy.Student");
// 使用有参数的构造方法
// c1.getConstructors();//获取所有的构造方法
// 传递是有参数的构造方法里面参数类型,类型使用class形式传递
Constructor con = clazz.getConstructor(String.class, int.class);
// 通过有参数的构造方法创建Student实例
Student s = (Student) con.newInstance("李四", 18);
System.out.println(s.getName() + "--" + s.getAge());
}
4. 使用反射操作属性
@Test
public void test3() throws Exception {
// 得到Class
Class clazz = Class.forName("com.yfy.Student");
// 获取Student类中的字段,包括私有
Field field = clazz.getDeclaredField("name");
// 对私有字段的访问取消权限检查。暴力访问。
field.setAccessible(true);
Student s = (Student) clazz.newInstance();
// 给s对象的name属性赋值
field.set(s, "王五");
//得到该字段在s对象中的属性值
System.out.println(field.get(s));
}
5. 使用反射操作普通方法
@Test
public void test4() throws Exception {
// 得到Class
Class clazz = Class.forName("com.yfy.Student");
// 获取带参数的构造方法
Constructor con = clazz.getConstructor(String.class, int.class);
Student s = (Student) con.newInstance("李四", 18);
//获取类中的带参方法
Method method=clazz.getMethod("method", int.class,int.class);
//调用带参方法
method.invoke(s, 3,7);
//获取类中的无参方法
Method method1=clazz.getMethod("show");
//调用无参方法
method1.invoke(s);
}
-
getDeclaredMethod(方法名称,方法里面参数的类型):得到任意一个方法,包括私有
-
getDeclaredMethods():得到所有方法,包括私有。
-
setAccessible(true):对私有方法取消权限检查。
6. junit的使用
JUnit 是一个 Java 编程语言的单元测试框架。JUnit 在测试驱动的开发方面有很重要的发展,是起源于 JUnit 的一个统称为 xUnit 的单元测试框架之一。
junit注解
-
@Test
:这个注释说明依附在 JUnit 的 public void 方法可以作为一个测试案例。 -
@Before
:有些测试在运行前需要创造几个相似的对象。在 public void 方法加该注释是因为该方法需要在 test 方法前运行。 -
@After
:如果你将外部资源在 Before 方法中分配,那么你需要在测试运行后释放他们。在 public void 方法加该注释是因为该方法需要在 test 方法后运行。 -
@BeforeClass
:在 public void 方法加该注释是因为该方法需要在类中所有方法前运行。 -
@AfterClass
:它将会使方法在所有测试结束后执行。这个可以用来进行清理活动。 -
@Ignore
:这个注释是用来忽略有关不需要执行的测试的。
执行过程
-
beforeClass()
: 方法首先执行,并且只执行一次。 -
afterClass()
:方法最后执行,并且只执行一次。 -
before()
:方法针对每一个测试用例执行,但是是在执行测试用例之前。 -
after()
:方法针对每一个测试用例执行,但是是在执行测试用例之后。 -
在 before() 方法和 after() 方法之间,执行每一个测试用例。
断言
unit所有的断言都包含在 Assert 类中。
这个类提供了很多有用的断言方法来编写测试用例。只有失败的断言才会被记录。Assert 类中的一些有用的方法列式如下:
方法 | 描述 |
---|---|
assertEquals(boolean expected, boolean actual) | 检查两个变量或者等式是否平衡 |
assertTrue(boolean expected, boolean actual) | 检查条件为真 |
assertFalse(boolean condition) | 检查条件为假 |
assertNotNull(Object object) | 检查对象不为空 |
assertNull(Object object) | 检查对象为空 |
assertSame(boolean condition) | 检查两个相关对象是否指向同一个对象 |
assertNotSame(boolean condition) | 检查两个相关对象是否不指向同一个对象 |
assertArrayEquals(expectedArray, resultArray) | 检查两个数组是否相等 |