java基础知识点(七)

一、Junit单元测试框架
    1.这是一个测试工具,用来测试一个方法的正确性
    
    2.使用步骤
        第一步:引入第三方的jar包
        第二步:写一个测试方法,在测试方法上,加上@Test注解
        第三步:点击绿色按钮执行,如果执行正确,就有绿色的提示
                                  如果执行失败,就有红色的提示
    3.常用注解

@Test: 被@Test标记的方法,是测试方法
@Before: 被@Before标记的方法,执行在每一个@Test标记的方法之前
@After: 被@After标记的方法,执行在每一个@Test标记的方法之后
@BeforeClass: 被@BeforeClass标记的方法,执行在所有方法之前,只执行一次
@AfterClass: 被@AfterClass标记的方法,执行在所有测试方法之后,只执行一次

二、反射
    1.反射有什么作用?
        反射可以用来获取一个类的各个组成成分,各个组成成分其实都是对象
            字节码对象: Class表示
            构造器对象: Constructor表示
            成员变量对象:Field表示
            成员方法对象:Method表示
    2.获取类的字节码三种方式

方式1: Class clazz1 = Class.forName("包名.类名");
方式2: Class clazz2 = 类名.class;
方式3: Class clazz3 = 对象.getClass();

3.通过反射获取构造器,并执行

         //第一步:获取类的字节码
		 Class clazz = Class.forName("包名.类名");
		 
		 //第二步:获取一个空参数的构造器
		 Constructor con = clazz.getConstructor();
		 //执行构造器,创建类的对象
		 Object obj = con.newInstance();
		 
		 //假设还有一个有参数的构造方法,可以获取有参数的构造器
		 Constrcutor con2= clazz.getDecalaredConstrcutor(参数类型1.class,
             参数类型2.class);
		 //假设构造器是私有的,在使用之前,必须取消权限检查
		 con2.setAccessible(true);
		 //执行有参数构造器,创建类的对象
		 Object obj2 = con2.newInstance(值1, 值2);

4.通过反射获取成员变量,并赋值、或者值

Class<?> clazz = Class.forName("com.itheima.d2_reflect.Student");
Field f1 = clazz.getField("name");
		
//使用成员变量时,先必须创建一个类的对象
Constructor con = clazz.getConstructor().newInstance();
		
//给成员变量赋值时、
f1.set(obj, "张三"); 
		
//给成员变量获取值
Object v = f1.get(obj);
System.out.println(v);

5.成员方法的反射

//第一步:获取类的字节码
        Class<?> clazz = Class.forName("com.itheima.d2_reflect.Student");
        
		//第二步:获取单个成员方法对象
	    //方法名是test2, 方法的参数是Stirng类型
        Method m2 = clazz.getMethod("test2", String.class);
		
		//第三步:执行方法
		//利用反射来创建类的对象
        Object obj = clazz.getConstructor().newInstance();
		m2.invoke(obj,"小明");    //等价于:obj.test2();

二、注解
    1.什么是注解
        注解其实就是一个标注,它可以给类、给方法、给变量等加上一些标注数据。
    2.如何定义注解

        //@Target:限定MyAnno注解的使用位置
		@Target({ElementType.TYPE,ElementType.FIELD,ElementType.METHOD})
		//@Tetention: 限定MyAnno注解能够存活的时间,在运行阶段有效
		@Retention(RetentionPolicy.RUNTIME)
		public @interface MyAnno{
			
		}

3.解析注解:通过反射获取类上、方法上、变量上的注解数据
        1)如果注解在类上,先获取类的字节码(Class),再通过Class对象类上的注解
        2)如果注解在方法上,先获取方法对象(Method),再通过Method对象获取方法上的注解
        3)如果注解在成员变量上,先获取成员变量的对象(Field),再通过Fiield对象获取变量上的注解


三、xml文件
    1.理解:
        xml是一种文件格式,通常用来当做软件的配置文件使用、也可以作为网络数据进行传输(很少用了,被json取代)
    2.xml文件的语法规则
        1)xml文件必须有一个文档声明,固定写法
            <?xml version="1.0" encoding="UTF-8"?>
            
        2)xml文件只能有一个根标签
        
        3)xml文件是由一个一个的标签组成的, 标签可以嵌套,但是不能交叉
            <student id="1">
                <name>张三</name>
                <age>20</age>
            </student>        
    3.xml约束
        理解:xml的约束是用来规定一个xml文件中可以些哪些标签
        种类:DTD约束(Mybatis框架中会用到)、Schema约束(Spring框架中会用到)
    
    4.xml解析
        理解:利用第三方提供的工具类,来读取xml文件中的数据,并且把数据封装Java对象

public class Demo2 {
			public static void main(String[] args) throws DocumentException {
				//解析Contacts.xml文件,把里面的每一个contact标签中的数据,封装为
                一个Contact对象
				//1.第一步:创建SAXReader解析器
				SAXReader saxReader = new SAXReader();
				//第二步:读取xml文件
				Document document = 
        saxReader.read(Demo2.class.getResourceAsStream("/Contacts.xml"));
				//第三步:获取根标签
				Element root = document.getRootElement();
				//准备好一个存储Contact对象的集合
				ArrayList<Contact> contacts = new ArrayList<>();
				//第四步:获取根标签下所有名称为contact的子标签(只能是第一级)
				List<Element> list = root.elements("contact");
				for (Element element : list) {
					//获取id和vip的属性值
					String id = element.attributeValue("id");
					String vip = element.attributeValue("vip");

					//获取name标签的文本, gender标签的文本, email标签的文本
					String name = element.elementText("name");
					String gender = element.elementText("gender");
					String email = element.elementText("email");

					//把读取到的数据封装成对象
					//boolean b = Boolean.parseBoolean(vip);
					Contact contact = new 
                Contact(id,Boolean.parseBoolean(vip),name,gender,email);
					//把对象添加到集合
					contacts.add(contact);
				}
				//遍历集合
				for (Contact contact : contacts) {
					System.out.println(contact);
				}
			}
		}

五、设计模式

什么是设计模式(Design pattern)

在开发中经常会遇到一些问题,而一个问题通常会有n中解法,但是其中有一种解法是最优的,这个最优的解法已经被前人总结出来了,这些被前人总结出来的解决特定问题的经验就称之为设计模式

设计模式有20多种,对应20多种软件开发中的问题,学设计模式主要学习2点

  1. 这种模式解决什么问题?
  2. 遇到这种问题,该模式怎么写,步骤是怎样的?

单例设计模式解决什么问题?

保证在系统中,运用到该模式的类永远只有一个实例(即只能创建一个对象)

单例设计模式(饿汉式)的设计步骤:

1、把类的构造器私有。

2、创建自己类的对象,并定义一个静态变量记住这个对象。

饿汉单例的实现步骤?

定义一个类,把构造器私有

创建一个自己类的对象,并用静态变量接收。

懒汉单例设计模式

在真正需要该对象的时候,才去创建一个对象(延迟加载对象)。

设计步骤:

定义一个类,把构造器私有。

定义一个用于记住当前对象的静态变量。

提供一个返回单例对象的方法。

什么是工厂设计模式?

设计模式是前人总结出来的,特定问题的解决方案

工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一, 这种类型的设计模式属于创建型模式,它提供了一种获取对象的方式。

工厂设计模式的作用:

对象通过工厂的方法创建返回,工厂的方法为该对象进行加工和数据注入。

可以实现类与类之间的解耦操作(核心思想)。

什么是装饰设计模式?

创建一个新类,包装原始类,从而在新类中提升原来类的功能。

装饰设计模式的作用:

作用:装饰模式指的是在不改变原类的基础上, 动态地扩展一个类的功能。

定义父类。

定义原始类,继承父类,定义功能。

定义装饰类,继承父类,包装原始类,增强功能!!


 

  • 36
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值