web_day11 反射

2017-09-17  本文已影响0人  路人爱早茶

1.xml用在传递数据(大多用json)和配置文件

<  &lt
> &gt
" &quot
' &apos
& &amp
--------------
在cdata区中不会被编译按源码进行
<![CDATA[
内容
]]>

2.dtd xml文件约束(较少使用)

图片.png 图片.png 图片.png

3.schema

图片.png
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://www.example.org/web-app_2_5" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.example.org/web-app_2_5 web-app_2_5.xsd"
    version="2.5">
    <servlet>
    <servlet-name>name</servlet-name>
    <servlet-class>cn.fb.schmer.Son</servlet-class>
    </servlet>
    <servlet-mapping>
    <servlet-name>name-map</servlet-name>
    <url-pattern>/url1</url-pattern>
    </servlet-mapping>
</web-app>
图片.png

4.dom4j解析器

图片.png 图片.png 图片.png

···
---------解析xml文件获得class反射路径--------
@Test
public void show1(){
try {
SAXReader read=new SAXReader();
Document doc = read.read("src/cn/fb/xml/dom4j/web.xml");
Element root = doc.getRootElement();
Element let = root.element("servlet");
Element classname = let.element("servlet-class");
Class class1=Class.forName(classname.getText());
Person son=(Person) class1.newInstance();
son.init();
son.body();
son.destory();
} catch (Exception e) {
e.printStackTrace();
}
}

···

5.反射

Person p = new Person();//创建Peron对象
Class clazz = p.getClass();
--------
Class clazz = Person.class;
--------------
 Class clazz = Class.forName("cn.itcast.bean.Person");//必须类全名
-----------------------
清单1,获取字节码文件中的字段。
Class clazz = Class.forName("cn.itcast.bean.Person");
//获取该类中的指定字段。比如age
Field field = clazz.getDeclaredField("age");//clazz.getField("age");    //为了对该字段进行操作,必须要先有指定类的对象。
Object obj = clazz.newInstance();
    //对私有访问,必须取消对其的访问控制检查,使用AccessibleObject父类中的setAccessible的方法
field.setAccessible(true);//暴力访问。尽量不要访问私有   
field.set(obj, 789);
    //获取该字段的值。
Object o = field.get(obj);
System.out.println(o);
备注:getDeclaredField:获取所有属性,包括私有。
  getField:获取公开属性,包括从父类继承过来的,不包括非公开方法。
清单2,获取字节码文件中的方法。
//根据名称获取其对应的字节码文件对象
Class clazz = Class.forName("cn.itcast.bean.Person");
//调用字节码文件对象的方法getMethod获取class对象所表示的类的公共成员方法(指定方法),参数为方法名和当前方法的参数,无需创建对象,它是静态方法
Method method = clazz.getMethod("staticShow", null);
//调用class对象所表示的类的公共成员方法,需要指定对象和方法中的参数列表
method.invoke(null, null);
………………………………………………………………………………………………………
Class clazz = Class.forName("cn.itcast.bean.Person");   
    //获取指定方法。
Method method = clazz.getMethod("publicShow", null);
    //获取指定的类对象。 
Object obj = clazz.newInstance();
method.invoke(obj, null);//对哪个对象调用方法,是参数组
好处:大大的提高了程序的扩展性。
上一篇下一篇

猜你喜欢

热点阅读