a.pull解析是一种基于事件流的解析方案,它会将xml中的每个元素看成一个对应的事件, 然后通过事件的发生,提取我们需要的数据。
b.pull解析是一种开源的解析方案,解析速度比较快,占用内存比较低,但不适合于执行一 些修改的动作。
c.Android 中内置了此种解析方案,很多xml解析都默认采用的的是pull解析。
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>>(); } }
|
反射是Java中对象运行时的一种自省机制,此机制的实现需要借助java.lang.reflect包中的一些API.
1)根据配置文件中的描述构建类的对象。
2)借助反射可以访问类中不可直接访问的属性或方法。
3)借助反射实现框架(AF)编程中通用模块的编写。
..........
在Java中应用反射首先要获得类对象(类型为Class),每个类的类对象只有一份。具体获得方式如下:
1)类名.class
2)类的对象.getClass();
3)Class.forName("包名.类名");
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 |
在反射应用中,我们可以将类中的每个成员都看成是对象,例如属性对象其类型为Field,方法对象其类型为Method,.....
1)通过类对象构建类的对象(记得类中要有无参的构造函数)
2)通过类对象获得属性对象,操作属性对象
3)通过类对象获得方法对象,执行方法对象
4)通过类对象获得构造方法对象,通过构造方法对象构建类的对象。
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); |
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)); |
//泛型是编译时的一种类型 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); |