W6-junit、泛型、枚举、增强for、可变参数、反射[JavaWeb]

1.单元测试Junit

  1.1 测试对象是一个类中的方法

  1.2 junit不是javase的部分,使用时需要导入jar包,myeclipse自带jar包

   1.3 单元测试方法的时候,方法命名规则 public void 方法名(){}

  1.4 使用注解方式运行,在方法的上面@Test

package cn.itcast.test02;

import org.junit.Test;

public class testDemo {
    //测试方法
    @Test
    public void testAdd1(){
        TestJunit test01=new TestJunit();
        test01.testAdd(2, 3);
    }
}

  -当出现绿色条,表示测试通过;红棕色表示测试不通过。

  [email protected]:表示该方法不进行单元测试

  [email protected]:在每个方法之前运行

  [email protected]:在每个方法之后运行

  -断言(了解):Assert.assertEquals("测试期望的值","方法运行的实际的值");

2.泛型

  2.1 泛型是提供给javac编译器使用的,它用于限定集合的输入类型,让编译器在源代码级别上,即挡住向集合中插入非法数据。但编译器编译完带有泛型的java程序后,生成的class文件中将不再带有泛型信息。以此使程序运行效率不受到影响,这个过程称为“擦除”。

  2.2 自定义泛型-泛型方法

   方法逻辑相同,只是数据类型不同,使用泛型方法

package cn.itcast.test03;

import java.util.Arrays;

public class TestDemo03 {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        //创建一个数组 实现11和13位置交换
        Integer[] arr1={10,11,12,13,14};
        swap1(arr1,1,3);

        System.out.println(Arrays.toString(arr1));

    }
    /*
     * 使用泛型方法 需要定义一个类型 使用大写字母表示 T:这个T表示任意的类型
     * 写在返回值之前 void 之前<T>
     * 表示定义了一个类型 这个类型是T
     */
    public static <T> void swap1(T[]arr,int a,int b){
        T temp=arr[a];
        arr[a]=arr[b];
        arr[b]=temp;
    }

}

  2.3 泛型在类上的使用:

package cn.itcast.test03;

public class TestDemo04 <T>{
    //在类里面可以直接使用T的类型
    T aa;
    public void test11(T bb){

    }
    //写一个静态方法 在类上面定义的泛型,不能在静态方法里面使用
    public static <A> void test12(A cc){

    }
}

3.枚举

  3.1 简介:需要在一定的范围内取值,这个值只能是这个范围内的任意一个

  3.2 现实场景:交通信号灯,有三种颜色,每次只能亮三种颜色的任意一个

package cn.itcast.test04;

public class TestEnum1 {
    private light color;

    public void test(){
        this.color=light.GREEN;
    }
}

enum light{
    RED,GREEN,YELLOW;
}

  3.3 枚举的构造方法是私有的

  3.4 特殊枚举-在枚举的类里面有构造方法,抽象方法

package cn.itcast.test04;

public class TestEnum2 {

}
enum Color11{
    RED("red") {
        @Override
        public void print1() {
            // TODO Auto-generated method stub

        }
    },
    GREEN("green") {
        @Override
        public void print1() {
            // TODO Auto-generated method stub

        }
    },
    YELLOW("green") {
        @Override
        public void print1() {
            // TODO Auto-generated method stub

        }
    };
    //带有参数的构造方法
    private Color11(String name){}
    //在枚举里面写了抽象方法后,在每个实例里面都实现抽象方法
    public abstract void print1();
}

  3.5 枚举的api(查看api)

4.  增强for

  4.1 for(遍历出来的值:要遍历的集合){}

  4.2 数组;实现Iterator接口(list和set),所以可以使用增强for循环

    map不能使用增强for循环,因为它没有实现Iterator接口

  4.3 出现的目的:为了替代迭代器

    增强for的底层就是迭代器

5. 可变参数

  5.1 可变参数的定义方法 数据类型...数组的名称

  5.2 源代码

package cn.itcast.test04;

public class TestDemo1 {
    public static void main(String[] args) {
        add1(11,22);
    }

    public static void add1(int...nums){
        //nums理解为一个数组,这个数组存储传递过来的参数
//        System.out.println(nums.length);
        int sum=0;
        //遍历数组
        for(int i=0;i<nums.length;i++){
            sum+=nums[i];
        }
        System.out.println(sum);
    }
}

  5.3 注意

  (1)可变参数需要写在方法的参数列表中,不能单独定义

  (2)在方法的参数列表中只能有一个可变参数

  (3)方法的参数裂变中的可变参数,必须放在最后

6 反射

  6.1 应用在一些通用性比较高的代码中,后期所学的框架大多是使用反射来实现的

  6.2 在框架开发中,都是基于配置文件开发。在配置文件中配置了类,可以通过反射得到类中的所有内容,可以让类中的某个方法执行

    类中的所有内容:属性,所有参数的构造方法,有参数的构造方法,普通方法

package cn.itcast.test05;

public class Person {
    //属性
    private String name;
    private String id;
    //没有参数的构造方法
    public Person(){}
    //有参数的构造方法
    public Person(String name, String id) {
        super();
        this.name = name;
        this.id = id;
    }
    //普通方法
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }

}

  6.3 第一步:保存Person.java;

    第二步:编译 Person.class ;

    第三步:JVM把class文件使用类加载器加载到内存中;

    第四步:Class类,class字节码文件在内存中表示;

    如果得到了Class类,可以得到这个类中的所有内容:属性,构造方法,普通方法;

      -使用反射首先得到Class类:(1)类名.class (2)对象.getClass() (3)使用Class.forName("路径")

    属性通过一个类 Field;构造方法通过一个类 Constructor;普通方法通过一个类 Method

  6.4 使用反射来操作类里面的构造方法,属性,普通方法

package cn.itcast.test05;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

import org.junit.Test;

public class TestDemo1 {
    public static void main(String[] args)throws Exception {
        // TODO Auto-generated method stub
        //获取Class类
        Class class1=Person.class;
        Class class2=new Person().getClass();
        Class class3=Class.forName("cn.itcast.test05.Person");

    }
    //使用泛型操作普通方法
    @Test
    public void test4()throws Exception{
        //得到Class
        Class c1=Class.forName("cn.itcast.test05.Person");
        //得到普通方法
//        c1.getDeclaredMethods();//得到所有的普通方法
        Person p4=(Person) c1.newInstance();
        Method m1=c1.getDeclaredMethod("setName", String.class);
        //如果操作的是私有方法,需要设置值是true
//        m1.setAccessible(true);
        //让setName方法执行,执行设置值
        m1.invoke(p4, "youqi");
        System.out.println(p4.getName());
    }

    //操作属性
    @Test
    public void test3(){
        try{
            //得到Class
            Class c2=Class.forName("cn.itcast.test05.Person");
            //得到name属性
//            c2.getDeclaredFields();//得到所有的属性
            Person p11=(Person)c2.newInstance();
            Field f1=c2.getDeclaredField("name");
            //设置可以操作私有属性
            f1.setAccessible(true);
            //设置name 的值
            f1.set(p11, "wangwu");//相当于在 p.name="wangwu"
            System.out.println(f1.get(p11));

        }catch(Exception e){
            e.printStackTrace();
        }

    }

    //需求:要对一个诶进行实例化,可以new,若不使用new应该怎么获取?
    //操作有参数的构造方法
    @Test
    public void test2()throws Exception{
        //得到Class
        Class class3=Class.forName("cn.itcast.test05.Person");
        //使用有参数的构造方法
//        class3.getConstructors();//获取所有的构造方法
        //传递的是有参数的构造方法里面的参数类型,类型使用class形式传递
        Constructor cs=class3.getConstructor(String.class,String.class);
        //通过有参数的构造方法设置值
        //通过有参数的构造方法设置Person实例
        Person p1=(Person)cs.newInstance("lisi","100");
        System.out.println(p1.getId()+"..."+p1.getName());
    }
    //操作无参数的构造方法
    @Test
    public void test1()throws Exception{
        //得到Class
        Class class3=Class.forName("cn.itcast.test05.Person");
        //得到Person类的实例
        Person p=(Person)class3.newInstance();
        //设置值
        p.setName("Zhangsan");
        System.out.println(p.getName());
    }

}

  6.5 当操作的方法是静态方法时,因为静态方法的调用方式是 类名.方法名,不需要类的实例;使用反射操作静态方法时候,也不要写实例

m1.invoke(null, "youqi");//直接写null

  

原文地址:https://www.cnblogs.com/ERFishing/p/11325414.html

时间: 2024-10-12 08:15:58

W6-junit、泛型、枚举、增强for、可变参数、反射[JavaWeb]的相关文章

Java面向对象_增强for可变参数与代码块

1.foreach循环 for(类型 变量名称:数组或集合){ //输出操作 } 2.可变参数:根据需要自动传入任意个数的参数,就是可变参数. 语法:返回值类型 方法名称(数据类型...参数名称){ } 例: 1 ublic class Practice14 { 2 3 /** 4 * @param args 5 */ 6 public static void main(String[] args) { 7 // TODO Auto-generated method stub 8 /*Strin

Effective Java 第三版——32.合理地结合泛型和可变参数

Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将近8年的时间,但随着Java 6,7,8,甚至9的发布,Java语言发生了深刻的变化. 在这里第一时间翻译成中文版.供大家学习分享之用. 32. 合理地结合泛型和可变参数 在Java 5中,可变参数方法(条目 53)和泛型都被添加到平台中,所以你可能希望它们能够正常交互; 可悲的是,他们并没有. 可变参数的目

(14)jdk1.5开始的一些新特性:静态导入,增强for循环,可变参数,自动装箱/拆箱,枚举类型

Jdk1.5新特性之静态导入 jdk1.5新特性值静态导入 静态导入的作用:简化缩写 静态导入的作用:可以作用一个类的所有静态成员. 静态导入的格式:import static 包名.类名.静态的成员 import static java.util.Collections.sort; //静态导入指定的某个静态成员方法 import static java.util.Collections.*;  导入所有的静态成员 除了可以导入静态的成员方法,也可以静态的导入成员变量,比如System.out

一、javaSE (十六)List的子类、泛型、增强for循环、静态导入、可变参数

1:List的子类(掌握) (1)List的子类特点 ArrayList: 底层数据结构是数組,查迿快,增删慢 线程不安全,效率高 Vector: 底层数据结构是数組,查询快,增删慢 线程安全,效率低 LinkedList: 底层数据结枃是链表,查询慢,增删快 线程不安全,效率高 (2)Arraylist A:没有特有功能需要学习 B:案例 a: Arraylist存储字符串并遍历 b: Arraylist存储自定义对象并遍历 (3)Vector A:特有功能 a:添加: public void

Java5新特性之静态导入、可变参数、增强for循环、自动拆装箱

JDK1.5已经发布很长时间,之所以还拿出来是因为它增加了很多个重要的特性,使用这些特性有助于我们简化开发,编写的代码更加简洁清晰安全,主要有以下几个特性: ?  静态导入 ?  可变参数 ?  增强for循环 ?  自动拆装箱 ? 泛型 ? 枚举 由于泛型.枚举内容比较多,也最重要,之后单拿出来讲.这里先介绍前面四个简单而又实用的小特性. 1. 静态导入 所谓"静态导入"只不过是在普通的import语句中加入关键字static,例如: ?  非静态导入:import java.lan

接口,泛型,可变参数在代码向上抽去中的应用探究

JAVA作为一种面向对象的语言,类和对象可以说是搭建起JAVA体系的基本框架,我们可以将类看做是对众多实体对象共性的向上抽取,而接口则是对类共性的向上抽取,我将接口理解为一种规则,一种规范,同时也是多态的应用中我们作为形式参数传递的最顶层的父类,因此接口的功能非常强大(能装B),我们在sun公司定义的API中可以经常看到它的身影,它也是架构师手中搭建框架的利器,因此以后我们会经常使用到它(能装B). ------------------------------------------------

javaweb学习总结二(静态导入、自动拆装箱、增强for与可变参数)

一:静态导入语法:import static 导入类.成员变量|成员方法那么在代码中可以直接使用变量或者方法,而不需要通过类名.来调用 静态导入: 1 import static java.lang.System.out; 那么在代码中直接调用变量: 1 @Test 2 //测试静态导入 3 public void testStaticImport() { 4 out.println("static import..."); 5 } 二:装箱或者拆箱装箱:将基本数据类型赋值给引用数据类

黑马程序员——【Java高新技术】——JDK1.5新特性:静态导入、可变参数、增强型for循环、自动装箱拆箱、枚举

一.静态导入 1.import和import static区别: (1)import 是导入一个类或某个包中所有的类. (2)import static是导入一个类中的某个静态方法或所有的静态方法. 注:在调用静态导入的类的静态方法时,可以不用再写类名.如Arrays.sort(int[])可以直接写sort(int[]); 2.静态导入的写法: (1)import static java.util.Arrays.*;   表示导入Arrays类中的所有静态成员. (2)import stati

增强for循环、Map接口遍历、可变参数方法

增强for循环 1.for循环能做得事情,增强for循环大部分都能做(如果要想获得下标的时候就必须使用简单for循环了) 2.增强for有时候能够方便的处理集合遍历的问题,但是集合的标准遍历是使用迭代器 3.在集合框架中体现出了它的强大之处 Map接口遍历 Map接口的遍历: 1.第一种方法 使用map.values()方法,先把value的值都放在一个Collection集合中. 2.第二种方法 使用map.entrySet()方法(推荐使用) 3.第三种方法 使用map.keySet()方法