目录
-
练习
* 加载类:
* 1.创建对象 (new clone 序列化)
* 2.调用类中静态内容的时候
* ...
*
* 在加载类的时候回首先加载静态的内容
* 注意:内容的常量如果能够直接计算出结果,就不会加载类
public class Test01 {
public static void main(String[] args) {
// System.out.println(A.NUM);//22
System.out.println(B.NUM); //0 0
B b=new B();
b.test();
}
}
class A{
public static final int NUM=15+7;
static{
System.out.println(NUM);
}
}
class B{
public static final int NUM=(int)Math.random()+1;
static{
System.out.println(NUM);
}
void test(){
System.out.println(NUM);
}
}
-
反射练习
package com.ref;
import java.lang.reflect.Array;
import java.util.Arrays;
/*
* 数组
*/
public class RefDemo02 {
public static void main(String[] args) {
//通过反射创建数组
int[] b=(int[])Array.newInstance(Integer.TYPE, 8);
System.out.println(Arrays.toString(b));
//判断是否为一个数组
Boolean flag=b.getClass().isArray();
if(flag){
//数组设置值
Array.set(b, 0, 8);
}
//数组获取值
System.out.println(Array.get(b, 0));
//获取数组的长度
System.out.println(Array.getLength(b));
}
}
class Person{}
-
注解
1.注解的作用:
1)对程序的解释说明
2)可以使用工具获取到类中的信息并作出相应的处理
2.如何使用注解:
@注解名 位置:根据不同的功能使用在不用的位置
3.注解的分类:
按照属性个数划分:
标记注解:没有属性 @Override
单值注解:一个属性 @SuppressWarnings
完整注解:多个属性
根据注解使用方法和用途:
1)、JDK内置系统注解
a: Override 检查是否为重写方法
b: Deprecated 过时 不推荐使用
c: SuppressWarnings 抑制警告
2)、元注解
注解 注解用的注解
1.@Target 决定注解的使用位置
如果没有定义Target,默认可以使用在任意位置
2.@Retention 决定注解的生命周期
SOURSE : 源代码中
ClASS : 编译期
RUNTIME : 运行期
3.@Documented: 可以存在于API文档中
4.@Inherited : 注解可以被继承
package day17.reflection;
import java.util.ArrayList;
import java.util.List;
@SuppressWarnings("all")
public class AnnotationDemo03 extends Fu {
@Deprecated
static int b = 5;
// @Override
static void test() {
System.out.println(b);
List ls = new ArrayList();
}
@SuppressWarnings("all")
public static void main(String[] args) {
test();
// @SuppressWarnings("all")
List ls = new ArrayList();
List ls2 = new ArrayList();
}
}
class Fu {
static void test() {
}
}
3)、自定义注解
使用@interface 自定义注解
如果字段名字为value,可以直接赋值(仅仅只有一个属性可以直接赋值),如果只有一个字段推荐使用value命名
default 可以设置默认值
属性的数据类型,只能为基本数据类型,String,Annotation,Class,枚举类型或以上这些类型的数组
字段的修饰符只能为public 和 default
自定义的注解类都继承了java.lang.Annotation
package day17.reflection;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@MetaAnno(num=13)
public class AnnoDemo04 {
String name;
// @MetaAnno
public static void main(String[] args) {
int a=5;
}
void test(){
}
// @MetaAnno
public AnnoDemo04() {
// TODO Auto-generated constructor stub
}
}
//自定义注解
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE,ElementType.METHOD,ElementType.CONSTRUCTOR,ElementType.PARAMETER})
//@Documented
@interface MetaAnno{
//字段
int num();
String value() default "hehe";
}
class Demo extends AnnoDemo04{
}
-
xml
可扩展的标记语言
1.标记语言用<>定义标签
2.标签要成对书写
3.xml比html要更严格,严谨,必须按照要求书写
4.xml可以用来做配置,传输,存储,更重于数据.
5.xml标签可以自定义,是可扩展的标记语言
6.根节点只能有存在一个
<?xml version="1.0" encoding="UTF-8"?>
<!-- 标记语言的注释 -->
<persons>
<person>
<name>张三</name>
<age>18</age>
<gender>男</gender>
</person>
<student>
<name>张二狗</name>
<age>17</age>
<gender>女</gender>
</student>
<person>
<name>球球</name>
<age>16</age>
<gender>男</gender>
</person>
</persons>
学习XML的重点:
掌握xml解析
了解约束
-
Sax
基于事件流
优点:节省内存空间
使用SAX解析的步骤:
1.获取sax解析器工厂
2.获取解析器
3.自定义处理器 继承一个defaultHandler
4.开始解析
package day17.reflection;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class SaxDemo01 {
public static void main(String[] args) throws Exception {
//1.获取工厂
SAXParserFactory saxParser=SAXParserFactory.newInstance();
//2.获取sax解析器
SAXParser parser=saxParser.newSAXParser();
//3.定义处理器
MyParser my=new MyParser();
//开始解析
parser.parse("src/day17/test/person.xml", my);
}
}
//定义处理器
class MyParser extends DefaultHandler{
//开始解析xml文档
@Override
public void startDocument() throws SAXException {
System.out.println("始解析xml文档");
}
//开始解析标签
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
System.out.println("开始解析标签");
}
//解析元素中的内容
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
System.out.println("解析元素中的内容");
}
//结束元素的解析
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
System.out.println("结束元素的解析");
}
//结束文档的解析
@Override
public void endDocument() throws SAXException {
System.out.println("结束文档的解析");
}
}
-
Dom4j
把整个文件一起加载到内存中,然后可以一切操作
缺点:耗内存
步骤:
1.获取一个SAXReader对象
2.使用文件获取Document对象
3.获取根节点
4.遍历
package day17.reflection;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
/*
* 步骤:
* 1.获取一个SAXreader对象
* 2.使用文件获取Document对象
* 3.获取根节点
* 4.解析
*/
public class Dom4jDemo01 {
public static void main(String[] args) throws DocumentException, IOException {
//获取Document对象
Document doc=getDocu("src/day17/test/person.xml");
//3.获取根节点
Element root=doc.getRootElement();
//获取迭代器编译
for(Iterator<Element> it=root.elementIterator();it.hasNext();){
Element element=it.next();
List<Element> ls=element.elements();
for(Element e:ls){
System.out.println(e.getName()+"--->"+e.getData());
}
}
write(doc);
}
public static void write(Document dos) throws IOException{
//1.选择流
XMLWriter writer;
//2.定义一个写出的格式
OutputFormat format=OutputFormat.createPrettyPrint();
// OutputFormat format=OutputFormat.createCompactFormat();
//3.创建流
writer=new XMLWriter(new FileWriter("src/haha.xml"),format);
writer.write(dos);
writer.flush();
writer.close();
}
//获取Document对象
public static Document getDocu(String str) throws DocumentException{
//1.获取一个SAXreader对象
SAXReader reader=new SAXReader();
//2.使用文件获取Document对象
Document doc=reader.read(str);
return doc;
}
}