xml&json

来源:互联网 发布:公司招人用什么软件 编辑:程序博客网 时间:2024/06/07 03:49

1.获取person类中age属性

通过反射获取成员变量并使用
获取所有成员
getFields,getDeclaredFields
获取单个成员
getField,getDeclaredField
修改成员的值
set(Object obj,Object value) 将指定对象变量上此

//获取person中age属性并使用
private static void method4() throws Exception{
// 1.获取person类的字节码对象(Class) 参数1:要反射类的完整包名 类名
Class class1 = Class.forName(“com.itheima.classtest.Person”);
//2.获取age属性并且使用 参数:获取哪个属性
Field field = class1.getDeclaredField(“age”);
//3.由于age是私有的 所以需要暴力反射
field.setAccessible(true);
//4.通过构造方法获取person的实例
Constructor constructor = class1.getConstructor();
Object obj = constructor.newInstance();
//5.给age赋值
field.set(obj, 11);
System.out.println(obj);
}

2.获取person类中方法

通过反射获取成员方法使用
获取所有方法
getMethods
getDeclaredMethods
获取单个方法
getMethod
getDeclaredMethod
暴力访问
method.setAccessible(true);

//获取person类中方法 不包括父类
private static void method2() throws Exception{
// 1.获取person类的字节码对象(Class) 参数1:要反射类的完整包名 类名
Class class1 = Class.forName(“com.itheima.classtest.Person”);
//2.获取方法 包含私有的
Method[] declaredMethods = class1.getDeclaredMethods(); //当前类所有方法 包括私有 不包括父类
//3.遍历
for (Method method : declaredMethods) {
System.out.println(method);
}
}

//获取person类中方法
private static void method1()throws Exception {
// 1.获取person类的字节码对象(Class) 参数1:要反射类的完整包名 类名
Class class1 = Class.forName(“com.itheima.classtest.Person”);
//2.获取方法
Method[] methods = class1.getMethods(); //☆☆☆ 获取的是当前类和父类的方法
//3.遍历
for (Method method : methods) {
System.out.println(method);
}
}

3.获取person类中单个方法并且使用

// 获取person类中私有方法 并调用
private static void method5() throws Exception {
// 1.获取person类的字节码对象(Class) 参数1:要反射类的完整包名 类名
Class class1 = Class.forName(“com.itheima.classtest.Person”);
// 2.获取show方法 让该方法调用 参数1:到底要反射哪个方法
Method method = class1.getDeclaredMethod(“funtion”);
method.setAccessible(true);
// 3.通过构造方法获取person的实例
Constructor constructor = class1.getConstructor();
Object obj = constructor.newInstance();
// 4.让show方法执行
method.invoke(obj);
}

// 获取person类中show2()
private static void method4() throws Exception {
// 1.获取person类的字节码对象(Class) 参数1:要反射类的完整包名 类名
Class class1 = Class.forName(“com.itheima.classtest.Person”);
// 2.获取show方法 让该方法调用 参数1:到底要反射哪个方法
Method method = class1.getMethod(“show2”, String.class);
// 3.通过构造方法获取person的实例
Constructor constructor = class1.getConstructor();
Object obj = constructor.newInstance();
// 4.让show方法执行
method.invoke(obj, “lxr”);
}

// 获取person类中show()
private static void method3() throws Exception {
// 1.获取person类的字节码对象(Class) 参数1:要反射类的完整包名 类名
Class class1 = Class.forName(“com.itheima.classtest.Person”);
// 2.获取show方法 让该方法调用 参数1:到底要反射哪个方法
Method method = class1.getMethod(“show”);
// 3.通过构造方法获取person的实例
Constructor constructor = class1.getConstructor();
Object obj = constructor.newInstance();
// 4.让show方法执行
method.invoke(obj);

}

4.反射应用场景1

通过配置文件运行类中的方法

public class Test {

public static void main(String[] args) throws Exception{

//1.读取配置文件
Properties properties = new Properties();
//2.加载配置文件
properties.load(new FileInputStream(“use.properties”));
//3.根据键获取到对应的值
String className = (String) properties.get(“className”);
String methodName = (String) properties.get(“methodName”);
//4.让className的methodName执行
Class class1 = Class.forName(className);
//5.获取类中的方法让其执行
Method method = class1.getMethod(methodName);
//6.通过构造方法获取实例
Constructor constructor = class1.getConstructor();
Object obj = constructor.newInstance();
//7.调用方法
method.invoke(obj);
}​
}

把要执行的类和方法写到一个配置文件中 创建一个

use.properties文件 内容如下
className=com.itheima.app1.Worker
methodName=work

5.反射应用场景2

public class ReflectApp2 {

public static void main(String[] args) throws Exception{

//1.创建list集合
List list = new ArrayList<>();
//2.往集合里添加一个元素
list.add(1);
//3.需求:添加String 用反射来实现 object
Class class1 = list.getClass();
//4.通过反射获取要执行 的方法
Method method = class1.getMethod(“add”, Object.class);
//5.让add方法执行
method.invoke(list, “lxr”);
System.out.println(list);
}​
}

6.单元测试

单元测试:是指对软件中的最小可测试单元进行检查和验证。
JUnit是一个开源代码的Java测试框架,用于编写和运行可重复的测试。Junit设计非常小巧,但是功能非常强大。
步骤:
1为当前工程添加JUnit4的库
2创建一个测试类,在测试方法加上@Test注解
3 使用断言Assert进行调试程序

为什么需要测试.在软件行业,好的软件不是开发出来的,是不断测试出来的. 当当网—>卖书的. -5 微信(按住录音).诺基亚

老板给一个需求: —–>一个一个的方法. 人perosn 吃 eat

单元测试步骤
1.就是在你想测试的方法上面加上一个符号 @Test @before @after
2.添加jnuit4jar包

7.注解

注解相当于是一种标记,在程序中加上注解就等于打上了某种标记,没加则没有某种标记,看你有什么标记就去做对应的事,标记可以加在包 ,类 ,方法 ,字段方法的参数和局部变量上.

7.1jdk中提供的几个注解
①suppresswarnings(“all”) 压制警告
②override 重写父类方法
③deprecated 代表过时
7.2 自定义注解. class interface enum 语法: @interface + 注解名
注解就相当于你的一个源程序中要调用的一个类,要在源程序中应用某个注解,得先准备好这个类.就像你要调用某个类,得先开发好这个类.这里写图片描述

注解:注解不是注释,注解相当于是一种标记,加上这个标记就做对应的事. 这个标记可以应用到类上 方法上 属性上 包这里写图片描述上…
定义注解非常简单和定义接口类似在接口的前面加上一个@就代表一个注解可以直接通过eclipse直接创建注解 如下图

7.3 自定义注解的属性
语法:返回值类型 属性名();

Invalid type Date for the annotation attribute CustomAnno.testStr; only primitive type, String, Class, annotation, enumeration are permitted or 1-dimensional arrays thereof

注解的自定义属性只能是 基本数据类型 String Class 注解 枚举 1维数组
7.4 自定义注解属性细节. 当定义的属性只有一个 并且属性名叫 value 的时候,在使用属性的时候 属性名可以省略.

8.注解应用场景

使用反射 和 注解 模拟单元测试测试.

元注解 : 注解的注解 元数据:数据的数据
元注解
@Retention三种取值
RetentionPolicy.SOURCE 对应java源文件
RetentionPolicy.CLASS 对应class文件
RetentionPolicy.RUNTIME 对应内存中的字节码

@Target
Target默认值为任何元素,设置target等ElementType.METHOD,原来加在类上的注解就报错了,改为用数组的方式设置{ElementType.METHOD,ElementType.TYPE}就可以了
为注解增加属性
字符串类型
String color();
String value(); //如果只有一个value 属性值让你去设置 那么就可以不写value和等号
数组类型
int[] arr(); 如果数组中只有一个元素,这时候属性值部分可以省略大括号
注解类型
MetaAnnotation annotationAttr();

public class Test {

/**
* 1 .反射person类
* 2 获取person类中所有的方法 判断哪个方法加上了注解
* 3.如果方法上有注解 就让带注解的方法执行
*
* @param args
*/
public static void main(String[] args) throws Exception {
//1.获取person的Class对象
Class class1 = Person.class;
//2.获取person类中所有的方法
Method[] methods = class1.getMethods();
//3.遍历
for (Method method : methods) {
//4.判断一下哪个方法带@myTest这个注解
boolean flag = method.isAnnotationPresent(myTest.class);
//5.为true的 让方法执行
if (flag) {
//6.获取person实例
Constructor constructor = class1.getConstructor();
Object obj = constructor.newInstance();
//6.让方法执行
method.invoke(obj);
}
}
}​
}

9.xml语言介绍

xml是什么 xml是w3c这个组织研发的.xml指可扩展(标签可以自己定义student)标记(标签)语言
XML是指可扩展标记语言(Extensible Markup Language),它是一种标记语言,很类似HTML。它被设计的宗旨是传输数据,而非显示数据。
XML标签没有被预定义,需要用户自行定义标签。
XML技术是W3C组织(World Wide Web Consortium万维网联盟)发布的,目前遵循的是W3C组织于2000年发布的XML1.0规范。
XML被广泛认为是继Java之后在Internet上最激动人心的新技术。

xml有什么用
①可以描述现实生活中的数据
XML语言出现的根本目的在于描述向上图那种有关系的数据。
XML是一种通用的数据交换格式。
在XML语言中,它允许用户自定义标签。一个标签用于描述一段数据;一个标签可分为开始标签和结束标签,在起始标签之间,又可以使用其它标签描述其它数据,以此来实现数据关系的描述。
XML中的数据必须通过软件程序来解析执行或显示,如IE;这样的解析程序称之为Parser(解析器)。

②可以作为应用程序的配置文件 比如android工程的布局文件.
③作为应用程序传输的数据格式

xml怎么用
一个XML文件分为如下几部分内容:
文档声明
在编写XML文档时,需要先使用文档声明来声明XML文档。且必须出现在文档的第一行。
最简单的语法

10.xml解析技术介绍

1.dom 特点:把整个xml文件加载到内存中,会在内存中形成一颗树形结构.
据xml层级结构在内存中分配一个树形结构

document :代表整个文档

element:代表元素对象(标签)
属性对象
文本对象

node节点对象,是上面对象的父对象

优点:可以进行增删改查逻辑
缺点:会造成内存溢出.
2.sax 当使用sax方式读到特定的标签时候,自动调用相应的方法进行操作
特点:一行一行解析 边解析边释放.
优点:它不会造成内存溢出
缺点:它只能查,不能实现增 删 改.
3.xmlpull 是android中内置解析器. 它解析原理 类似sax.
首先,导入pull的jar包(两个jar包)。原理其实就是sax解析
使用pull解析xml文件把xml中的内容放到集合里面

步骤:
1、创建解析器工厂
2、根据解析器工厂创建解析器
3、把要操作的文件放到解析器里面
4. xmlpull代码实现
☆☆☆ 由于xmlpull解析技术是android的技术所以这个技术默认只能在android工程中使用.

@Test
public void xmlpullParser2() throws Exception{
//1.创建xml解析器的工厂 通过查看api文档得知
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
//2.通过工厂的实例 获取xml解析器
XmlPullParser parser = factory.newPullParser();
//3.告诉解析器要解析哪个文件
parser.setInput(new FileInputStream(“bookstore.xml”), “utf-8”);
//4.获取要解析文件的事件类型 sax是基于事件解决
int eventType = parser.getEventType();
//5.通过循环来解析xml文件 没有解析到文件结尾就一直解析 1阅读性查
while(eventType!= XmlPullParser.END_DOCUMENT){
if (“name”.equals(parser.getName())) {
String name = parser.nextText();
System.out.println(“name:”+name);
}else if (“price”.equals(parser.getName())) {
String price = parser.nextText();
System.out.println(“price:”+price);
}
eventType = parser.next();
}
}

5.把解析出来的数据封装到集合List. 为什么要封装到集合里.目的就是为了方便展示信息.

@Test
public void xmlpullParser3() throws Exception {
// 0.创建一个集合 javabean entity
List lists = null;
Book book = null;
// 1.创建xml解析器的工厂 通过查看api文档得知
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
// 2.通过工厂的实例 获取xml解析器
XmlPullParser parser = factory.newPullParser();
// 3.告诉解析器要解析哪个文件
parser.setInput(new FileInputStream(“bookstore.xml”), “utf-8”);
// 4.获取要解析文件的事件类型 sax是基于事件解决
int eventType = parser.getEventType();
// 5.通过循环来解析xml文件 没有解析到文件结尾就一直解析 1阅读性查
while (eventType != XmlPullParser.END_DOCUMENT) {
// 6.具体判断一下到底解析的是开始标签还是结束标签
switch (eventType) {
case XmlPullParser.START_TAG: //代表解析的是开始标签
//6.1 具体判断一下到底是哪个开始标签
if (“bookstore”.equals(parser.getName())) {
//6.2 初始化list集合
lists = new ArrayList<>();
}else if (“book”.equals(parser.getName())) {
//6.3创建book对象
book = new Book();
}else if (“name”.equals(parser.getName())) {
//6.4 获取name对应数据
String name = parser.nextText();
book.setName(name);
}else if (“price”.equals(parser.getName())) {
//6.4 获取name对应数据
String price = parser.nextText();
book.setPrice(price);
}
break;
case XmlPullParser.END_TAG: //代表解析的是结束标签

if (“book”.equals(parser.getName())) {
//6.5 把book对象加入到list集合
lists.add(book);
}
break;
}
//不停的解析
eventType = parser.next();
}
//7 当while循环结束后 我们看list集合里面有几本书
for (Book book2 : lists) {
System.out.println(book2);
} ​
}

原创粉丝点击