day3.30总结_pull解析和反射

一、xml pull解析

1)概述

 

a.pull解析是一种基于事件流的解析方案,它会将xml中的每个元素看成一个对应的事件,   然后通过事件的发生,提取我们需要的数据。

b.pull解析是一种开源的解析方案,解析速度比较快,占用内存比较低,但不适合于执行一  些修改的动作。

 

c.Android 中内置了此种解析方案,很多xml解析都默认采用的的是pull解析。

 

2)解析的解析步骤

 

1)构建解析器对象(XmlPullParser):借助Xml类型的静态方法

2)解析xml(setInput(....))

3)处理数据(借助5种事件)

例子:

private String str=

                                   "<notes>"+

                                   "<note><title>titleA</title><content>ContentA</content></note>"+

                                   "<note><title>titleB</title><content>ContentB</content></note>"+

                                   "</notes>";

       private List<Map<String,String>> list;

       private Map<String,String> map;

       @Override

       protected void onCreate(Bundle savedInstanceState) {

              super.onCreate(savedInstanceState);

              setContentView(R.layout.activity_main);

              //创建解析对象

              XmlPullParser xxp = Xml.newPullParser();

              try {

                     //读取文件

                     xxp.setInput(new StringReader(str));

                     //获取时间类型

                     int event = xxp.getEventType();

                     do {

                            if(event ==START_DOCUMENT){

                                   processStarDocument();

                            }else if(event == START_TAG){

                                   processStarTag(event,xxp);

                            }else if(event == END_TAG ){

                                   processEndDocument(xxp);

                            }

                            event = xxp.next();

                     } while (event != END_DOCUMENT);

                     Log.i("Tag", "list="+list.toString());

              } catch (Exception e) {

                     e.printStackTrace();

              }

       }

       //文档结束

       private void processEndDocument(XmlPullParser xxp) {

              if(xxp.getName().equals("note")){

                     //添加到List

                     list.add(map);

                     //清空map

                     map = null;

              }

             

       }

       //标签开始

       private void processStarTag(int event, XmlPullParser xxp) throws Exception {

              if(xxp.getName().equals("note")){

                     //创建一个map集合

                     map = new HashMap<String,String>();

              }else if(xxp.getName().equals("title")){

                     map.put(xxp.getName(), xxp.nextText());

              }else if(xxp.getName().equals("content")){

                     map.put(xxp.getName(), xxp.nextText());

              }    

       }

       //文档开始

       private void processStarDocument() {

              //创建List集合

              list = new ArrayList<Map<String,String>>();

       }

}

 

 

二、反射(API)

 

1)何为反射

 

反射是Java中对象运行时的一种自省机制,此机制的实现需要借助java.lang.reflect包中的一些API.

 

2)反射的应用场合

1)根据配置文件中的描述构建类的对象。

2)借助反射可以访问类中不可直接访问的属性或方法。

3)借助反射实现框架(AF)编程中通用模块的编写。

..........

 

3)Java 中反射的起点

 

在Java中应用反射首先要获得类对象(类型为Class),每个类的类对象只有一份。具体获得方式如下:

 

1)类名.class

2)类的对象.getClass();

3)Class.forName("包名.类名");

例子1:获得某个类类对象的三种方式

 

                Class<?> c1=MainActivity.class;

                MainActivity aty=new MainActivity();

                Class<?> c2=aty.getClass();

                Class<?> c3=

                Class.forName("day20.MainActivity");

                //类对象在内存只有一份

                System.out.println(c1==c2);//true

                System.out.println(c2==c3);//true

 

 

4)ava反射中类对象的应用

 

在反射应用中,我们可以将类中的每个成员都看成是对象,例如属性对象其类型为Field,方法对象其类型为Method,.....

 

1)通过类对象构建类的对象(记得类中要有无参的构造函数)

2)通过类对象获得属性对象,操作属性对象

3)通过类对象获得方法对象,执行方法对象

4)通过类对象获得构造方法对象,通过构造方法对象构建类的对象。

例子2:通过类对象或的构造方法对象

Class<?> c=Class.forName("day20.Button");

      //通过类对象或的构造方法对象

      Constructor<?> con=c.getDeclaredConstructor(String.class);

      //通过构造方法对象构建类的对象

      Button btn=(Button)con.newInstance("button");

      System.out.println(btn);

 

      //获得Button(int width,int height)构造方法对象

      con=c.getDeclaredConstructor(int.class,int.class);

      //设置私有可访问

      con.setAccessible(true);

      //通过构造方法对象构建类的对象

      btn=(Button)con.newInstance(10,20);

      System.out.println(btn);

例子3:通过类对象获得属性对象,操作属性对象

TextView tv=new TextView();

              //通过反射修改tv中isDisplay属性的值

              //1.获得TextView的类对象

              Class<?> c=tv.getClass();

              //2.获得TextView中isDisplay属性对象

              Field f=c.getDeclaredField("isDisplay");

              f.setAccessible(true);

              //3.修改tv对象的isDisplay属性值

              f.setBoolean(tv,true);

              System.out.println(f.getBoolean(tv));

 

例子4:通过类对象获得方法对象,执行方法对象

        //泛型是编译时的一种类型

              List<String> list=new ArrayList<>();//Object[]

              list.add("A");

              //list.add(100);

             

              //1.获得类对象

              Class<?> c=list.getClass();

              //2.获得add方法对象

              Method m =c.getDeclaredMethod("add",Object.class);

              //m.setAccessible(true);

              //3.执行此方法(执行list对象的m方法)

              m.invoke(list, 100);

              Object result=m.invoke(list, true);

              System.out.println(list);

              System.out.println(result);

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值