php网站连接数据库教程,济南物流公司网站建设,做网站的如何找客户,三门峡网站设计文章目录 前言1. 单元测试2. 反射2.1 获取Class对象的三种方式2.2 获取类的构造器的方法2.3 获取类的成员变量2.4 获取类的成员方法2.5 反射的作用 3. 注解3.1 自定义注解3.2 注解的原理3.3 元注解3.4 注解的解析 4. 动态代理5. 总结 前言
终于走到新手村的末端了#xff0c;… 文章目录 前言1. 单元测试2. 反射2.1 获取Class对象的三种方式2.2 获取类的构造器的方法2.3 获取类的成员变量2.4 获取类的成员方法2.5 反射的作用 3. 注解3.1 自定义注解3.2 注解的原理3.3 元注解3.4 注解的解析 4. 动态代理5. 总结 前言
终于走到新手村的末端了这一部分主要包括了单元测试、发射、注解、动态代理。学完这些就算是走出新手村了准备去学框架了。
1. 单元测试
就是针对最小的功能单元方法编写测试代码对其进行正确性测试。
在这之前都是在Main方法里面编写测试代码去调用方法进行测试。但这样无法实现自动化测试一个方法测试失败可能影响其他方法的测试。同时无法得到测试的报告需要程序员自己去观察测试是否成功。
于是就有了Junit单元测试框架。
优点
可以灵活的编写测试代码可以针对某个方法执行测试也支持一键完成对全部方法的自动化测试且各自独立不需要程序员去分析测试的结果会自动生成测试报告出来
具体步骤
将Junit框架的jar包导入到项目中IDEA集成了junit框架不需要手工导入为需要测试的业务类定义对应的测试类并为每个业务方法编写对应的测试方法必须公共、无参、无返回值测试方法上必须声明Test注解然后在测试方法中编写代码调用被测试的业务方法进行测试开始测试选中测试方法右键选择JUnit运行如果测试通过是绿色反之是红色
自己写的一个类
package junit;public class StringUtil {public static void printNumber(String name) {System.out.println(长度是 name.length());}public static int getMaxIndex(String data) {if(data null)return -1;return data.length();}
}
测试类
package junit;import org.junit.Assert;
import org.junit.Test;/*
测试类*/
public class StringUtilTest {// 公开 无返回值 无参数Test // 测试方法public void testPrintNumber() {StringUtil.printNumber(admin);
// StringUtil.printNumber(null);}Testpublic void testGetMaxIndex() {int index1 StringUtil.getMaxIndex(null);int index2 StringUtil.getMaxIndex(admin);System.out.println(index1 index2);// 断言机制程序员可以通过预测业务方法的结果Assert.assertEquals(方法内部有bug, 4, index2);}
} Emm感觉现在我可能用不到就当了解一下吧。
2. 反射
后面的这些东西都是后面理解框架、学习框架的时候看底层源码用得到的所以目前也就当是一个了解吧。
反射就是加载类并允许以编程的方式解剖类中的各种成分成员变量、方法、构造器等
反射第一步加载类获取类的字节码Class对象获取类的构造器Constructor对象获取类的成员变量Field对象获取类的成员方法Method对象
2.1 获取Class对象的三种方式
Class c1 类名.class调用Class提供方法public static Class forName(String package);Object提供的方法public Class getClass(); Class c3 对象.getClass();
2.2 获取类的构造器的方法 或许以我现在的知识来看真是有点脱裤子放屁还不了解这些的作用。
2.3 获取类的成员变量 获取到成员变量的作用赋值、取值。
2.4 获取类的成员方法 2.5 反射的作用
基本作用可以得到一个类的全部成分然后操作可以破坏封装性最重要的用途适合做Java的框架
写一个Demo框架
Student
package reflect;public class Student {private String name;private int age;private char sex;private double height;public Student(String name, int age, char sex, double height) {this.name name;this.age age;this.sex sex;this.height height;}public String getName() {return name;}
}框架
package reflect;import java.io.FileOutputStream;
import java.io.PrintStream;
import java.lang.reflect.Field;public class ObjectFrame {public static void saveObject(Object obj) throws Exception {PrintStream ps new PrintStream(new FileOutputStream(text.txt));Class c obj.getClass();String cName c.getSimpleName(); // 获取类的简单名称ps.println(__________ cName __________);Field[] fields c.getDeclaredFields();// 遍历每个成员变量for (Field field : fields) {field.setAccessible(true); // 禁止检查访问控制// 拿到成员变量的名字String name field.getName();// 拿到这个成员变量在对象中的数据String val field.get(obj) ;ps.println(name val);}ps.close();}
}测试类
package reflect;import org.junit.Test;public class TestFrame {Testpublic void save() throws Exception{Student s new Student(jehan, 21, m, 180.5);ObjectFrame.saveObject(s);}
}结果 3. 注解
注解就是Java代码里面的一些特殊标记比如Override、Test等作用是让其他程序根据注解信息来决定怎么执行该程序比如加了注解就执行没有加注解就不执行这也是Junit框架的原理。
3.1 自定义注解
public interface 注解名称 {public 属性类型 属性名() default 默认值;
}特殊属性名value 如果注解中只有一个value属性使用注解时value名称可以不写
3.2 注解的原理 注解本质是一个接口继承自Annotation类里面都是一些抽象方法。
当使用使用注解的时候里面的信息都是在创建一个对象实现了该注解以及Annotation接口。
3.3 元注解
指的是修饰注解的注解。
常用的元注解就2个
Target声明被修饰的注解只能在哪些位置使用Retention声明注解的保留周期
3.4 注解的解析
就是判断类上、方法上、成员变量上是否存在注解并把注解里的内容给解析出来。
如何解析注解
要解析类上的注解就应该先获取该类的Class对象再通过Class对象解析其上面的注解要解析成员方法上的注解则应该获取到该成员方法的Method对象再通过Method对象解析其上面的注解Class、Method、Field、Constructor都实现了AnnotatedElement接口它们都拥有解析注解的能力。
4. 动态代理
动态代理是一种在程序运行时创建目标对象的代理对象并对目标对象的方法进行功能性增强的技术。这是一种结构设计模式也称为委托模式。其核心思想在于当需要对已有的代码方法前后添加新功能而不想修改或不方便修改原代码时可以利用动态代理来实现。
例如假设我们有一个Human接口我和黄牛都实现了这个接口。现在我和黄牛都已经准备好了怎么把这二者关联起来呢我们要明确的是黄牛是要帮我买票的买票必然就需要帮我实现Human接口中的方法。在这种情况下我们可以创建一个动态代理对象来“委托”黄牛来执行某些功能。 这一块先留个坑吧后面用到了再好好学一下就跟着视频敲了一遍demo。
自己写的类
package proxy;public class SuperStar implements Star{private String name;public SuperStar(String name) {this.name name;}public String sing(String name) {System.out.println(this.name 正在唱 name);return Thanks;}public void dance() {System.out.println(dancing~);}
}
代理
package proxy;import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;public class ProxyUtil {public static Star createProxy(SuperStar ss) {// 参数1默认// 参数2指定生成的代理长什么样子也就是有哪些方法// 参数3指定生成的代理要干什么事情Star starProxy (Star) Proxy.newProxyInstance(ProxyUtil.class.getClassLoader(),new Class[]{Star.class}, new InvocationHandler() {Override // 回调方法public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {// 代理对象要做的事情会在这里写代码if(method.equals(sing)) {System.out.println(准备话筒和场地);} else if(method.equals(dance)) {System.out.println(准备场地, 伴舞);}return method.invoke(ss, args);}});return starProxy;}
}
主函数
package proxy;public class Test {public static void main(String[] args) {SuperStar s new SuperStar(IU);Star starproxy ProxyUtil.createProxy(s);String res starproxy.sing(blueming);System.out.println(res);}
}
5. 总结
花了差不多一周把Java全部过完了一遍目前后面的计划安排是每天刷几道力扣进一步熟悉熟悉Java然后去学JavaWeb吧大概就是这样也希望能在12月之前开到奖这样我想是今年生日送给我的最好的一份礼物了。后面我会把一些写好了的面经帖和我这一年的一个经历与心路历程发出来本来想着就不发了但是还是有一些朋友私信我希望我能够分享一下那后面就整理一下发吧。我也不知道后面还有多少机会去产出博客也是希望给后来者一条清晰的路吧大学生最大的敌人是信息差。
So有缘再见吧Bye~