web.xml

<?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>helloServlet</servlet-name>
<servlet-class>cn.sasa.web01.servlet.Hello</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>helloServlet</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping> <servlet>
<servlet-name>hiServlet</servlet-name>
<servlet-class>cn.sasa.web01.servlet.Hi</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>hiServlet</servlet-name>
<url-pattern>/hi</url-pattern>
</servlet-mapping>
</web-app>

创建一个接口,其实现类实现接口的方法

package cn.sasa.web01.servlet;

public interface IMyServlet {
public void init();
public void service();
public void destory();
}

创建两个实现类Hello、Hi实现IMyServlet接口

package cn.sasa.web01.servlet;

public class Hello implements IMyServlet {

    @Override
public void init() {
System.out.println("hello----init");
} @Override
public void service() {
System.out.println("hello----service");
} @Override
public void destory() {
System.out.println("hello----destory");
} }
package cn.sasa.web01.servlet;

public class Hi implements IMyServlet {

    @Override
public void init() {
System.out.println("hi----init");
} @Override
public void service() {
System.out.println("hi----service");
} @Override
public void destory() {
System.out.println("hi----destory");
} }

测试:

package cn.sasa.web01.servlet;

import java.lang.reflect.Method;
import java.util.List; import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader; public class Test {
public static void main(String[] args) {
SAXReader reader = new SAXReader();
// try {
// Document doc = reader.read("src/cn/sasa/web01/servlet/web.xml");
// Element root = doc.getRootElement();
// Element servElement = root.element("servlet");
// String className = servElement.element("servlet-class").getText();
// //System.out.println(str);
// Class c1 = Class.forName(className);
// hello obj = (hello)c1.newInstance();
// obj.init();
// obj.service();
// obj.destory();
// } catch (Exception e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// } try {
//获取xml文档对象
Document doc = reader.read("src/cn/sasa/web01/servlet/web.xml");
//获取根节点
Element root = doc.getRootElement();
List<Element> chilNodes = root.elements();
for(Element e : chilNodes) {
if("servlet".equals(e.getName())) {
//获取类全名
String className = e.element("servlet-class").getText();
//反射获取字节文件对象
Class c = Class.forName(className);
//生成对象
Object obj = c.newInstance();
//获取方法
Method init = c.getMethod("init", null);
//运行
init.invoke(obj, null); Method service = c.getMethod("service", null);
service.invoke(obj, null); Method destory = c.getMethod("destory", null);
destory.invoke(obj, null);
}
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

根据xml配置使用反射动态生成对象的更多相关文章

  1. Vue+Element的动态表单,动态表格(后端发送配置,前端动态生成)

    Vue+Element的动态表单,动态表格(后端发送配置,前端动态生成) 动态表单生成 ElementUI官网引导 Element表单生成 Element动态增减表单,在线代码 关键配置 templa ...

  2. C++ 动态生成对象

    1.啰嗦一下 说起C++,很多人都觉着难学,其实我也是这么觉着的,在这个移动端火到爆的时代,我都想改行了,移动端做东西那都是现有的第三方库,拿来就可以用,而且稳定性好,开发速度快,而且最关键的是出东西 ...

  3. .net core将URL请求格式化为XML或JSON(网站动态生成sitemap.xml)

    .net core将URL请求格式化为XML或JSON(网站动态生成sitemap.xml) 首先设置 Startup.cs 文件 配置 ConfigureServices services .Add ...

  4. python-根据字符串动态生成对象eval

    # -*- coding: utf-8 -*- stock1={ 'stockName':"沈阳机床", ", 'averagePrice_yesterday':34.0 ...

  5. cglib根据数据动态生成对象

    最近有个任务:根据查询SQL直接导出报表 实现关键是,怎么根据sql查询的数据动态生成对象列表,想到Cglib动态代理实现 废话少说,上代码: 定义动态生成Java Bean类: import jav ...

  6. 利用runtime动态生成对象?

    利用runtime我们能够动态生成对象.属性.方法这特性 假定我们要动态生成DYViewController,并为它创建属性propertyName 1)对象名 NSString *class = @ ...

  7. WPF 动态生成对象属性 (dynamic)

    原文:WPF 动态生成对象属性 (dynamic) 项目中列行的数据 都需要动态生成 所以考虑到对象绑定  可需要一个动态生成属性的意思 缺点 加载速度会慢 很明显的慢 解决办法 尽量减轻动态属性的量 ...

  8. 反射的妙用:C#通过反射动态生成类型继承接口并实现

    起因 最近想自己鼓捣个RPC,想着简化RPC调用方式,直接申明接口,然后根据接口的属性去配置RPC调用的相关信息.有一种说法叫申明式调用. 简单来说就是,申明一个interface,动态继承并实例化, ...

  9. 06 Mybatis 使用xml配置映射模式+动态SQL---使用案例

    1.项目结构 2.数据库表User对应的实体类 package domain; import java.io.Serializable; import java.util.Date; /** * 数据 ...

随机推荐

  1. 【网络编程】——ne-snmp开发实例1

    net-snmp扩展有多种方式,在此只介绍两种——动态库扩展,静态库扩展. 在做net-snmp开发之前,首先确定net-snmp相关的软件是否安装. rpm -qa | grep snmp net- ...

  2. SPARKR,对RDD操作的介绍

    (转载)SPARKR,对RDD操作的介绍   原以为,用sparkR不能做map操作, 搜了搜发现可以. lapply等同于map, 但是不能操作spark RDD. spark2.0以后, spar ...

  3. Win7/Win10多用户同时使用远程桌面

    Win7/Win10正常情况下是不允许多用户同时远程的,即一个用户远程进来会把另一个用户踢掉,需要破解. Win7:安装UniversalTermsrvPatch-x64.exe,见https://p ...

  4. Android 数据库 大量插入 事务开启

    对比在Android中批量插入数据的3中方式对比(各插入1W条数据所花费的时间): 1. 一个一个插入 publicstaticboolean insert(SQLiteOpenHelper open ...

  5. connect()返回SOCKET_ERROR不一定就是连接失败

    connect()用于建立与指定socket的连接. 头文件: #include <sys/socket.h> 函数原型: int connect(int s, const struct ...

  6. 6.25python线程问题

    #encoding=utf-8 #2018-6-25 20:34:48 #解决耦合的问题#用队列解决这种问题,起到了缓冲的作用 import threading import time # #pyth ...

  7. Java面向对象进阶篇(抽象类和接口)

    一.抽象类 在某些情况下,父类知道其子类应该包含哪些方法,但是无法确定这些子类如何实现这些方法.这种有方法签名但是没有具体实现细节的方法就是抽象方法.有抽象方法的类只能被定义成抽象类,抽象方法和抽象类 ...

  8. 《手机端》让多出的导航变水平拖动,不让他 float 撑下去

    /********** 网站底部 **************/ .nav{;;;;white-space: nowrap;overflow: auto;-webkit-overflow-scroll ...

  9. ABP之事件总线(3)

    承接上一篇时间总线的学习,在上一篇中我们实现了取消显式注册事件的方式,采用使用反射的方式.这样的好处可以解除Publisher和Scriber的显式依赖,但是问题又来了,因为我们只有Publisher ...

  10. python和selenium

    错误提示: selenium.common.exceptions.SessionNotCreatedException: Message: Unable to find a matching set ...