当前位置: 首页 > news >正文

做学习交流网站南平摩托车罚款建设网站缴费

做学习交流网站,南平摩托车罚款建设网站缴费,网站右下角广告代码,掌网站开发的基本流程十五、Java高级 单元测试、反射、注解、动态代理。 1、单元测试 定义#xff1a;就是针对最小的功能单元(方法),编写测试代码对其进行正确性测试。 1.1 Junit单元测试框架 可以用来对方 法进行测试#xff0c;它是第三方公司开源出来的(很多开发工具已经集成了Junit框架…十五、Java高级 单元测试、反射、注解、动态代理。 1、单元测试 定义就是针对最小的功能单元(方法),编写测试代码对其进行正确性测试。 1.1 Junit单元测试框架 可以用来对方 法进行测试它是第三方公司开源出来的(很多开发工具已经集成了Junit框架比如IDEA) 优点可以灵活的编写测试代码可以针对某个方法执行测试也支持一键 完成对全部方法的自动化测试,且各自独立。不需要程序员去分析测试的结果会自动生成测试报告出来。 1.2 测试案例 某个系统有多个业务方法请使用Junit单元测试框架 编写测试代码,完成对这些方法的正确性测试。 具体测试步骤 将Junit框架的jar包导 入到项目中(注意: IDEA集成了Junit框架,不需要我们自己手工导入了)为需要测试的业务类,定义对应的测试类,并为每个业务方法,编写对应的测试方法(必须:公共、无参、无返回值)测试方法 上必须声明Test注解然后在测试方法中编写代码调用被测试的业务方法进行测试。开始测试: 选中测试方法右键选择JUnit运行”如果测试通过则是绿色;如果测试失败则是红色。 1、只测试某个方法直接点击该方法的左侧运行按钮运行即可 2、测试该测试类的所以方法点击该参数类的左侧运行按钮运行即可 3、要测试该项目的所以测试类直接右击该项目名——点击 run All Tests //工具类 public class Function {//获取字符串长度public static int getStringLenght(String str){if(strnull){return 0;}return str.length();}//获取字符串最后一个字母的索引public static int getStringMaxIndex(String str){if(strnull){return -1;}return str.length();} }//工具类的测试类 //点击在测试类左侧的运行按钮就测试所以的方法 public class FunctionTest {Test //测试类(点击左侧的运行按钮即可运行所对应的方法)//保证方法是public、无返回值、无形参public void getStringLenghtTest(){//直接调用要测试的方法这里写的是静态方法直接通过类名调取int len Function.getStringLenght(hello);int len2Function.getStringLenght(null);System.out.println(len);System.out.println(len2);}Testpublic void getStringMaxIndexTest(){int index1Function.getStringMaxIndex(hello);int index2Function.getStringMaxIndex(null);System.out.println(index1);System.out.println(index2); //会发现测试没有报错但是结果可能有问题。//可以使用结果断言就是可以用自己的预测结果和方法得出的结果进行比较看看是不是一样的。//参数有误时的提示信息自己预测结果方法得出的结果Assert.assertEquals(测试结果有误,4,index1);} }Junit单元测试常见注解说明Test测试类中的方法必须用它修饰才能成为测试方法才能启动执行Before Junit5改名为 BeforeEach用来修饰一个实例方法该方法会在每一个测试方法执行之前执行一次。After Junit5改名为 BeforeEach用来修饰一个实例方法该方法会在每一个测试方法执行之后执行一次。BeforeClass Junit5改名为BeforeAll 用来修饰一个静态方法该方法会在所有测试方法之前只执行一次。AfterClass Junit5改名为AfterAll用来修饰一个静态方法该方法会在所有测试方法之后只执行一次。 在测试方法执行前执行的方法常用于初始化资源。 在测试方法执行完后再执行的方法常用于释放资源。 2、反射 反射就是加载类,并允许以编程的方式解剖类中的各种成分(成员变量、方法、构造器等)。 作用反射主要是用来做框架的 学习获取类的信息、操作它们实现步骤 反射第一步加载类获取类的字节码: Class对象获取类的构造器Constructor对象获取类的成员变量Field对象获取类的成员方法:Method对象 2.1 反射第一步加载类获取类的字节码: Class对象 获取Class对象的三种方式 Class c1 类名.class调用Class提供方 法: public static Class forName(String package);Object提供的方法: public Class getClass(); Class c3 对象.getClass(); public class Student {private String name;private String sex;private int age; }//测试类 public class ReflectTest {public static void main(String[] args) throws Exception {//Class c1 类名.classClass c1Student.class;System.out.println(c1.getName()); //获取全类类名包名加类名System.out.println(c1.getSimpleName()); //获取简单类名类名//调用Class提供方 法: public static Class forName(String package);Class c2Class.forName(akc4.reflect.Student); //参数为全类类名System.out.println(c1c2); //等到的都是同一个类true//Object提供的方法: public Class getClass(); Class c3 对象.getClass();Student studentnew Student();Class c3student.getClass();System.out.println(c2c3); //等到的都是同一个类true} }2.2 获取类的构造器Constructor对象 Class提供了从类中获取构造器的方法说明Constructor? [ ] getConstructors()获取全部构造器只能获取public修饰的Constructor? [ ] getDeclaredConstructors()获取全部构造器只能存在就能拿到Constructor getConstructor(Class? … parmeterTypes )获取某个构造器只能获取public修饰的Constructor getDeclaredConstructor( Class? … paramerTyoes )获取某个构造器只要存在就能拿到 //学生实体类 public class Student {private String name;private String sex;private int age;public Student() {}private Student(String name, String sex) {this.name name;this.sex sex;}public Student(String name, String sex, int age) {this.name name;this.sex sex;this.age age;} }//测试类 public class StudentTest {After //每个测试方法结束后都会执行public void soutAfter(){System.out.println(---------------);}//获取多少构造器Testpublic void testGetConstructors(){//1、获取到对应类的类Class对象Class c1Student.class;//2、通过 getConstructors()方法获取到所有用public修饰的构造器Constructor[] cons1c1.getConstructors();for (Constructor constructor : cons1) {//获取构造器名和形参个数System.out.println(constructor.getName()---constructor.getParameterCount());}System.out.println();//3、通过getDeclaredConstructors() 方法获取所有的构造器一般用这个获取多个构造器Constructor[] cons2c1.getDeclaredConstructors();for (Constructor constructor : cons2) {//获取构造器名和形参个数System.out.println(constructor.getName()---constructor.getParameterCount());}}Testpublic void testGetDeclaredConstructor() throws Exception {//1、获取对应类的ClassClass c2Student.class;//2、通过getConstructor(形参类型)方法获取public修饰的某个构造器Constructor con1c2.getConstructor(); //获取无参构造器public修饰的//获取public修饰的形参为三个且形参类型对应的构造器Constructor cons2c2.getConstructor(String.class,String.class,int.class);//获取指定的任何一个构造器不限修饰类型Constructor cons3c2.getDeclaredConstructor(String.class,String.class);System.out.println(con1.getName() cons2.getName() cons3.getName());}}获取类构造器的作用依然是初始化对象返回 Constructor对象提供的方法说明T newIntstance(Object…initargs)调用此构造器对象表示的构造器并传入参数完成对象的初始化并返回public void setAccessible( boolean flag )设置为true表示禁止检查访问控制就是即使是私有的构造器也能访问暴力反射 //学生实体类 public class Student {private String name;private String sex;private int age;public Student() {System.out.println(无参构造器被调用了);}private Student(String name, String sex) {this.name name;this.sex sex;}public Student(String name, String sex, int age) {this.name name;this.sex sex;this.age age;}Overridepublic String toString() {return Student{ name name \ , sex sex \ , age age };} }//测试类 public class StudentTest {Testpublic void testGetDeclaredConstructor() throws Exception {//1、获取对应类的ClassClass c2Student.class;//2、通过getConstructor(形参类型)方法获取public修饰的某个构造器Constructor con1c2.getConstructor(); //获取无参构造器public修饰的//获取public修饰的形参为三个且形参类型对应的构造器Student student(Student) con1.newInstance(); //没有写参数调用的就是无参构造器System.out.println(student);//获取指定的任何一个构造器不限修饰类型Constructor cons3c2.getDeclaredConstructor(String.class,String.class);cons3.setAccessible(true); //暴力反射, 即使是private修饰的也能调用了 Student student1(Student) cons3.newInstance(小明,男);System.out.println(student1);}}2.3 获取类的成员变量Field对象 Class提供了从类中获取成员变量的方法 方法说明public Field[ ] getFields()获取类id全部成员变量只能获取public修饰的public Field[ ] getDeclaredields()获取类的全部成员变量只要存在就能拿到public Field getField(Sting name)获取类的某个成员变量只能获取public修饰的public Field getDeclaredField(String name)获取类的某个成员变量只要存在就能拿到 获取到成员变量的作用:依然是赋值、取值。 方法说明void set(Object obj , Object value)赋值Object get( Object obj )取值public void setAccessible( boolean flag )设置true 表示禁止检查访问控制(暴力反射) //实体类 public class Student {public String name;public String id;private String sex;private int age;public Student() {} }//测试类 public class StudentTest {After //每个测试方法结束后都会执行public void soutAfter(){System.out.println(---------------);} Testpublic void testFields(){//1、获取到对应类的Class对象Class cStudent.class;//2、获取到所有用public修饰的成员变量Field[] fieldsc.getFields();//3、遍历拿到的成员变量for (Field field : fields) {//输出变量名和变量类型System.out.println(field.getName()field.getType());}System.out.println();//2、获取全部成员变量Field[] fields1c.getDeclaredFields();//3、遍历拿到的成员变量for (Field field : fields1) {//输出变量名和变量类型System.out.println(field.getName()field.getType());}}Testpublic void testField() throws Exception {//1、获取到对应类的Class对象Class c1Student.class;//2、获取public修饰的某个成员变量(成员变量名)Field field c1.getField(name);System.out.println(field.getName()field.getType());System.out.println();//2、获取某个成员变量。不限修饰成员变量名Field field1c1.getDeclaredField(age);System.out.println(field1.getName()field1.getType());//3、为成员变量赋值//3.1 创建一个对象Student studentnew Student();//由于field1对应的age是私有的成员变量所以要暴力反向field1.setAccessible(true);//赋值(要赋值的具体对象符的值)field1.set(student,20);//获取值int age(int)field1.get(student);System.out.println(age);} }3.4 获取类的成员方法:Method对象 Class提供了从类中获取成员方法的API。 方法说明Method[ ] getMethod()获取类的全部成员方法(只能获取public修饰的)Method[ ] getDeclaredMethods()获取类的全部成员方法(只要存在就能拿到)Method getMethod(String name, Class? … parameterTypes)获取类的某个成员方法(只能获取public修饰的)参数(方法名参数类型如String.class)Method getDeclaredMethod(String name , Class? … parameterType )获取类的某个成员方法(只要存在就能拿到)参数(方法名参数类型如String.class) 成员方法的作用:依然是执行 Method提供的方法说明public Object invoke( Object obj , Object … args )触发某个对象的该方法执行public void setAccessible( boolean flag )设置true表示禁止检查访问控制暴力反射 //实体类 public class Student {private String name;private String sex;private int age;public Student() {}private String run(int num){return 跑num圈操场;} }//测试类 public class StudentTest {Testpublic void testMethod() throws Exception {//1、创建一个类对应的ClassClass cStudent.class;//获取某个方法不限修饰参数为要获取方法的方法名形参列表的各个类型Method method c.getDeclaredMethod(run,int.class);//2、由于run方法是私有的所以要暴力反向method.setAccessible(true);//3、获取某个方法需要一个对应对象Student studentnew Student();//4、调用该方法并传入参数(要调用对象的对象名调用方法的参数)String str (String) method.invoke(student,10);System.out.println(str);}}3.5 反射的运用场景 基本作用可以得到一个类的全部成分然后操作。可以破坏封装性。 最重要的用途是适合做Java的框架基本上主流的框架都会基于反射设计出- -些通用的功能。 使用反射做一个简易版的框架 需求对于任意一个对象,该框架都可以把对象的字段名和对应的值保存到文件中去。 实现步骤 ①定义一个方法可以接收任意对象。 ②每收到一个对象后使用反射获取该对象的Class对象,然后获取全部的成员变量。 ③遍历成员变量然后提取成员变量在该对象中的具体值。 ④把成员变量名、和其值写出到文件中去即可。 3、注解( Annotation ) 就是Java代码里的特殊标记比如: Override、 Test等作用是让其他程序根据注解信息来决定怎么执行该程序。 注意注解可以用在类上、构造器上、方法上、成员变量上、参数上、等位置处。 3.1 自定义注解 //自定义注解格式 public interface 注解名称{public 属性类型 属性名() default 默认值; }//注解 public interface MyTest {//默认public可以不写public String name();//可以写默认值写了在赋值的时候可以不写int age() default 10;String[] hobby(); }//测试注解 MyTest(name小明,age19,hobby{唱,跳,篮球}) public class AnnotationTest {public static void main(String[] args) {}MyTest(name小红,hobby{唱,跳,篮球})public static void run(){} }1、特殊属性名: value 如果注解中只有一个value属性使用注解时, value名称可以不写 2、注解的本质 注解本质是一个接口Java中所有注解都是继承了Annotation接口的。 注解(…)其实就是一个实现类对象实现了该注解以及Annotation接口。 3.2 元注解 是指的是修饰注解的注解 常用的2个元注解Target 和 Retention Retention( Retent ionPol icy . RUNTIME ) //元注解1 Target({ElementType .METHOD}) //元注解2 public interface Test { }3.2.1 Target 元注解 作用声明被修饰的注解只能在哪些位置使用。 //格式 Target(ElementType.TYPE) public interface Test { }TYPE类、接口FIELD成员变量METHOD成员方法PARAMETER方法参数CONSTRUCTOR构造器LOCAL_VARIABLE局部变量 //限定修饰类型为成员变量 Target(ElementType.FIELD) public interface MyTest {String value(); }public class AnnotationTest {//现在只能修饰成员变量了MyTest(hello)private String name; }3.2.2 Retention 元注解 作用声明注解的保留周期。 //格式 Retention(RetentionPolicy.RUNTIME) public interface Test { }SOURCE只作用在源码阶段字节码文件中不存在。CLASS默认值保留到字节码文件阶段运行阶段不存在。RUNTIME开发常用一直保留到运行阶段。 //一直保留到运行阶段 Retention(RetentionPolicy.RUNTIME) public interface MyTest {String value(); }public class AnnotationTest {//现在只能修饰成员变量了MyTest(hello)private String name; }3.2.2 注解的解析 定义就是判断类上、方法上、成员变量上是否存在注解并把注解里的内容给解析出来。 指导思想要解析谁上面的注解就应该先拿到谁。比如要解析类上面的注解则应该先获取该类的Class对象再通过Class对象解析其上面的注解。比如要解析成员方法上的注解则应该获取到该成员方法的Method对象再通过Method对象解析其上面的注解。 Class、Method 、Field , Constructor.都实现了AnnotatedElement接口它们都拥有解析注解的能力。 AnnotatedElement接口提供的解析注解方法说明public Anotation[ ] getDeclaredAnnotations()获取当前对象上面的注解public T getDeclaredAnnotationClass annottationClass获取指定的注解对象public boolean isAnnotationPresent(Class annotationClass)判断当前对象上是否存在某个注解 解析注解案例 ①定义注解MyTest4, 要求如 ➢包含属性: String value() ➢包含属性: double aaa(),默认值为100 ➢包含属性: String[] bbb() ➢限制注解使用的位置: 类和成员方法上 ➢指定注解的有效范围: - -直到运行时 ②定义一个类叫: Demo,在类中定义一个test1方法 并在该类和其方法.上使用MyTest4注解 ③定义AnnotationTest3测试类 解析Demo类中的全部注解。 //自定义注解 Target({ElementType.TYPE,ElementType.METHOD}) Retention(RetentionPolicy.RUNTIME) public interface MyTest {String value();double aaa() default 100;String[] bbb(); }//使用注解的类 MyTest(value java,aaa120,bbb {python,HTML}) public class Demo {MyTest(value JS,bbb {C语言,C})public void test1(){} } //测试类 public class AnnotationTest {Testpublic void testClassAnnotation(){//1、获取到对应类的对象Class cDemo.class;//2、解析类上的注解// 判断类对象是否有对应的注解if (c.isAnnotationPresent(MyTest.class)){//3、获取到类上的注解对象MyTest myTest(MyTest) c.getDeclaredAnnotation(MyTest.class);//4、通过类上的对象获取到对应的参数System.out.println(myTest.value());System.out.println(myTest.aaa());System.out.println(Arrays.toString(myTest.bbb()));}}Testpublic void testMethodAnnotation() throws Exception {//1、获取到对应的类对象Class cDemo.class;//2、获取到类的Method对象Method mc.getDeclaredMethod(test1);//3、判断方法上是否有对应的注解if(m.isAnnotationPresent(MyTest.class)){//4、获取到注解的对象MyTest myTest(MyTest)m.getDeclaredAnnotation(MyTest.class);//5、通过注解对象获取获取到方法上注解的参数System.out.println(myTest.value());System.out.println(myTest.aaa());System.out.println(Arrays.toString(myTest.bbb()));}} }3.2.3 注解的运用场景 需求定义若干个方法只要加了MyTest注解就会触发该方法执行。 分析 ①定义一个自定义注解MyTest,只能注解方法存活范围是一直都在。 ②定义若干个方法部分方法加.上MyTest注解修饰部分方法不加。 ③模拟一个junit程序可以触发加了MyTest注解的方法执行。 //注解 Target(ElementType.METHOD) //只能方法才能使用的注解 Retention(RetentionPolicy.RUNTIME) //触发范围一直到运行阶段 public interface MyTest { }public class Demo {//定义一下方法要求只有加了注解的方法才能触发MyTest()public void test1(){System.out.println(test1);}MyTestpublic void test2(){System.out.println(test2);}public void test3(){System.out.println(test3);}MyTestpublic void test4(){System.out.println(test4);}public static void main(String[] args) throws Exception{//1、获取到类这个Class对象Class c Demo.class;//2、通过类对象获取到类对象里面的所有方法Method[] methods c.getDeclaredMethods();//3、通过遍历获取到里面的每一个方法for (Method method : methods) {//4、判断里面的每一个方法是否带有注解if(method.isAnnotationPresent(MyTest.class)){//5、创建一个要被执行方法的对象将这个对象作为参数Demo demonew Demo();//执行带有注解的这个方法method.invoke(demo);}}}}4、动态代理 代理是一种设计模式它提供了一种机制通过代理对象来访问目标对象从而在不修改原始对象的基础上添加额外的功能或限制访问。 java.lang.reflect.Proxy类提供了为对象产生代理对象的方法: public static Object newProxyInstance(ClassLoader loader, Class?[] interfaces, InvocationHandler h)/* 参数一用于指定用哪个类加载器去加载生成的代理类 参数二指定接口这些接口用于指定生成的代理长什么也就是有哪些方法 参数三用来指定生成的代理对象要干什么事情*/案例蔡徐坤他有很多的才艺唱歌跳舞打篮球…,但是呢他肯定不会白白的在大众面向做这些肯定是要收钱的而且还要准备舞台什么的他又不会去自己去收钱、搭建舞蹈什么的因为他只负责唱、跳等自己擅长的领域这时其它的工作就会交给代理去做代理做好前期工作后代理才叫他来展示他的才艺。下面是实现代码 //大明星的才艺接口 public interface Star {String sing(String singname);void dance();void basketball(); }//大明星类 //大明星要学习这些才艺实现接口的方法 public class BigStar implements Star {private String name;public BigStar(String name) {this.name name;}//创建2个方法public String sing(String singName){System.out.println(this.name 唱完了 singName);return 唱得怎么样谢谢谢谢;}public void dance(){System.out.println(this.name 跳了);}public void basketball(){System.out.println(this.name 打篮球了);} }//一个代理工具类大明星可以在这里找代理 public class ProxyUtil {//1、创建一个静态方法用来完成代理工作,接收一个大明星类就是为bigStar做代理public static Star createProxy(BigStar bigStar){//2、创建一个代理对象/*Object newProxyInstance(ClassLoader loader,Class?[] interfaces,InvocationHandler h)参数1用于指定一个类加载器一般就行写这个类的类加载器参数2指定生成的代理长什么样子也就是有哪些方法是一个数组装其来的,由于这里只接收一个方法就把它直接放到数组里去参数3用于指定生成的代理要做什么事情它是一个接口所以要不能直接创建对象就new一个匿名内部类对象来指定代理对象做什么事情*/Star starProxy(Star) Proxy.newProxyInstance(ProxyUtil.class.getClassLoader(), new Class[]{Star.class}, new InvocationHandler() {//invoke方法等一下会去main方法调用这个工具类将bigStar对象作为参数得到一个Star对象再通过Star对象调用sing和dance方法调用这两个方法就会去调用invoke方法。//sing和dance方法被调用时也会把3个参数填到invoke方法中//参数1java会把当前的代理对象当作一个Object对象放到其中//参数2java会把调用的方法当作Method传进来如果外面在调用sing方法那么method就是sing方法//参数3被调用方法的参数java会把被调用的方法的产生传到args数组中Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {//代理对象要做的事情会在这里写代码//1、通过method来判断被调用的是哪个方法if(method.getName().equals(sing)){System.out.println(准备话筒收100块);//2、执行被代理发方法(参数为被代理的对象被调用方法的参数)有返回值的直接返回return method.invoke(bigStar,args);}else if(method.getName().equals(dance)){System.out.println(准备一个舞台收20块);//2、执行被代理发方法(参数为被代理的对象被调用方法的参数)return method.invoke(bigStar,args);}else {//其它方法return method.invoke(bigStar,args);}}});//将代理对象返回出去return starProxy;} }//测试类大明星展示才艺类 public class Test {public static void main(String[] args) {//通过有参构造器创建一个需要被代理的对象创建了蔡徐坤大明星BigStar bigStarnew BigStar(蔡徐坤);//调用代理工具类静态方法创建一个代理对象,将需要被代理的对象传过去蔡徐坤找来一个代理Star starProxyUtil.createProxy(bigStar);//通过代理对象调用代理方法String str star.sing(鸡你太美);System.out.println(str);//通过代理对象调用代理方法star.dance(); //通过代理对象调用代理方法star.basketball(); } }
http://www.dnsts.com.cn/news/108276.html

相关文章:

  • 高端定制网站建设开创云网站建设支持
  • 芙蓉区乡建设局网站公司网站建设代理一般做多久
  • 大同百度做网站多少钱凡科网免费网站域名注册
  • 怎么往网站换图片南昌seo推广公司
  • 免费国外网站空间奉贤品牌网站建设
  • 网站搭建代理两个男性做网站
  • 呼市企业网站制作鞍山网站设计制作
  • 做企业网站所需要的资料wordpress如何看访问量
  • 用什么程序做网站最好优化通过网络营销学到了什么
  • 西安地区专业做网站公司查看网站备案号
  • iis 发布网站 500企业机房建设公司
  • 深圳网咯鸟网站建设公司怎么样注册公司最少需要多少钱
  • 公司建设网站费用吗深圳做网站龙华新科
  • 深圳做英文网站的公司互动平台网站建设
  • 用哪个网站做相册视频个人网站制作基本步骤
  • 做内容网站现在还做响应式网站吗
  • 网站文件解压网站建设 ader
  • 上海好的网站设计公司一个公司可以做两个网站不
  • 深圳市公司网站建设价格陕西省建设信息网站
  • 上海黄浦区网站建设登录浙江省建设信息港
  • 已备案网站域名青岛电子商务的网站建设
  • 河南移动商城网站建设动画设计专业好的学校
  • 简洁大气公司网站天长市城乡规划建设局网站
  • 冀州做网站的公司百度搜索引擎网址格式
  • 上国外网站用什么机箱好一个人做网站原型
  • 国外私人网站二级域名免费分发
  • 上海网站建设技术托管wordpress 火车头
  • wordpress 站内信 群发常州网站建设价位
  • 网站怎么发外链安卓app市场
  • 建设 信用中国 网站外包的优缺点