- 单元测试
- 所谓单元测试,就是针对最小的功能单元,编写测试代码对其进行正确性测试。
- 常用框架:Junit
- 反射
- 定义:反射技术,指的是加载类的字节码到内存,并以编程的方法解刨出类中的各个成分(成员变量、方法、构造器等)。
- 获取类的字节码
public class Test1Class{
public static void main(String[] args){
Class c1 = Student.class;
System.out.println(c1.getName());
System.out.println(c1.getSimpleName());
Class c2 = Class.forName("com.itheima.d2_reflect.Student");
System.out.println(c1 == c2);
Student s = new Student();
Class c3 = s.getClass();
System.out.println(c2 == c3);
}
}
- 获取类的构造器
-
- get:获取
- Declared: 有这个单词表示可以获取任意一个,没有这个单词表示只能获取一个public修饰的
- Constructor: 构造方法的意思
- 后缀s: 表示可以获取多个,没有后缀s只能获取一个
来测试获取类中所有的构造器
public class Test2Constructor(){
@Test
public void testGetConstructors(){
Class c = Cat.class;
Constructor[] constructors = c.getDeclaredConstructors();
for(Constructor constructor: constructors){
System.out.println(constructor.getName()+"---> 参数个数:"+constructor.getParameterCount());
}
}
}
单个构造器
public class Test2Constructor(){
@Test
public void testGetConstructor(){
Class c = Cat.class;
Constructor constructor1 = c.getConstructor();
System.out.println(constructor1.getName()+"---> 参数个数:"+constructor1.getParameterCount());
Constructor constructor2 =
c.getDeclaredConstructor(String.class,int.class);
System.out.println(constructor2.getName()+"---> 参数个数:"+constructor1.getParameterCount());
}
}
- 获取成员变量
- 获取成员方法
public class Test3Method{
public static void main(String[] args){
Class c = Cat.class;
Method[] methods = c.getDecalaredMethods();
for(Method method : methods){
System.out.println(method.getName()+"-->"+method.getParameterCount()+"-->"+method.getReturnType());
}
}
}
public class ObjectFrame{
public static void saveObject(Object obj) throws Exception{
PrintStream ps =
new PrintStream(new FileOutputStream("模块名\\src\\data.txt",true));
Class c = obj.getClass();
ps.println("---------"+class.getSimpleName()+"---------");
Field[] fields = c.getDeclaredFields();
for(Field field : fields){
String name = field.getName();
Object value = field.get(obj)+"";
ps.println(name);
}
ps.close();
}
}
- 注解
- 比如现在我们要模拟Junit写一个测试框架,要求有@MyTest注解的方法可以被框架执行,没有@MyTest注解的方法不能被框架执行。
- 注解定义
@Target(ElementType.METHOD)
@Retetion(RetetionPloicy.RUNTIME)
public @interface MyTest{
}
public class AnnotationTest4{
@MyTest
public void test1(){
System.out.println("=====test1====");
}
@MyTest
public void test2(){
System.out.println("=====test2====");
}
public void test3(){
System.out.println("=====test2====");
}
public static void main(String[] args){
AnnotationTest4 a = new AnnotationTest4();
Class c = AnnotationTest4.class;
Method[] methods = c.getDeclaredMethods();
for(Method m: methods){
if(m.isAnnotationPresent(MyTest.class)){
m.invoke(a);
}
}
}
}
- 动态代理
public interface UserService {
void login(String loginName,String passWord) throws Exception;
void deleteUsers() throws Exception;
String[] selectUsers() throws Exception;
}
public class UserServiceImpl implements UserService{
@Override
public void login(String loginName, String passWord) throws Exception {
long time1 = System.currentTimeMillis();
if("admin".equals(loginName) && "123456".equals(passWord)){
System.out.println("您登录成功,欢迎光临本系统~");
}else {
System.out.println("您登录失败,用户名或密码错误~");
}
Thread.sleep(1000);
long time2 = System.currentTimeMillis();
System.out.println("login方法耗时:"+(time2-time1));
}
@Override
public void deleteUsers() throws Exception{
long time1 = System.currentTimeMillis();
System.out.println("成功删除了1万个用户~");
Thread.sleep(1500);
long time2 = System.currentTimeMillis();
System.out.println("deleteUsers方法耗时:"+(time2-time1));
}
@Override
public String[] selectUsers() throws Exception{
long time1 = System.currentTimeMillis();
System.out.println("查询出了3个用户");
String[] names = {"张全蛋", "李二狗", "牛爱花"};
Thread.sleep(500);
long time2 = System.currentTimeMillis();
System.out.println("selectUsers方法耗时:"+(time2-time1));
return names;
}
}
public class ProxyUtil {
public static UserService createProxy(UserService userService){
UserService userServiceProxy
= (UserService) Proxy.newProxyInstance(
ProxyUtil.class.getClassLoader(),
new Class[]{UserService.class},
new InvocationHandler() {
@Override
public Object invoke( Object proxy,
Method method,
Object[] args) throws Throwable { if(
method.getName().equals("login") || method.getName().equals("deleteUsers")||
method.getName().equals("selectUsers")){
long startTime = System.currentTimeMillis();
Object rs = method.invoke(userService, args);
long endTime = System.currentTimeMillis();
System.out.println(method.getName() + "方法执行耗时:" + (endTime - startTime)/ 1000.0 + "s");
return rs;
}else {
Object rs = method.invoke(userService, args);
return rs; }
} });
return userServiceProxy;
}
}
public class Test {
public static void main(String[] args) throws Exception{
UserService userService = ProxyUtil.createProxy(new UserServiceImpl());
userService.login("admin", "123456");
System.out.println("----------------------------------");
userService.deleteUsers();
System.out.println("----------------------------------");
String[] names = userService.selectUsers();
System.out.println("查询到的用户是:" + Arrays.toString(names));
System.out.println("----------------------------------");
}
}