Java反射机制

  • Java反射(Java Reflection)是指在程序运行时获取已知名称的类或已有对象的相关信息的一种机制,包括类的方法、属性、父类等信息,还包括实例的创建和实例类型的判断等。在反射中使用最多的类是Class,Class类的实例表示正在运行的Java应用程序中的类和接口,其forName(String className)方法可以返回与带有给定字符串名的类或接口相关联的 Class对象,再通过Class对象的newInstance()方法创建此对象所表示的类的一个新实例, 即通过一个类名字符串得到类的实例。

  • 例如创建一个字符串类型的对象,其代码如下:

    1
    2
    3
    4
    //通过类名生成实例对象并将其返回
    Class c = Class.forName("java.lang.String");
    Object obj = c. newlnstance();
    return obj;
  • 此外,在JDK中还提供了java.lang.reflect包,封装了其他与反射相关的类。

配置文件

  • 软件系统的配置文件通常为XML文件,可以使用DOM (Document Object Model)、SAX(Simple API for XML)、StAX(Streaming API for XML)等技术来处理 XML 文件。

  • 在实际开发中可以把类名存储到XML配置文件中,再读取配置文件获取类名字符串,然后通过Java反射机制来创建对象。

    1
    2
    3
    4
    5
    <!-- config.xml -->
    <?xml version="1.0"?>
    <config>
    <className> java.lang.String </className>
    </config>
  • 为了读取该配置文件,并通过存储在其中的类名字符串反射生成对象,可以创建一个工具类XMLUtil,其详细代码如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    package getXmlTest;

    import javax.xml.parsers.* ;
    import org.w3c.dom.* ;
    import java.io.* ;

    public class XMLUtil {
    //该方法用于从XML配置文件中提取具体类的类名,并返回一个实例对象
    public static Object getBean() {
    try {
    //创建DOM文档对象
    DocumentBuilderFactory dFactory = DocumentBuilderFactory.newlnstance();
    DocumentBuilder builder = dFactory.newDocumentBuilder();
    Document doc;
    doc = builder, parse(new File("src//getXmlTest//config.xml"));
    //获取包含类名的文本结点
    NodeList nl = doc.getElementsByTagName("className");
    Node classNode = nl.item(0).getFirstChild();
    String cName = classNode.getNodeValue();
    //通过类名生成实例对象并将其返回
    Class c = Class.forName(cName);
    Object obj = c.newlnstance();
    return obj;
    }
    catch(Exception e) {
    e.printStackTrace();
    return null;
    }
    }
    }
  • 具体使用:

    1
    2
    3
    4
    //getBean()的返回类型为Object,需要进行强制类型转换
    Class c = (Class)XMLUtil.getBean();
    Object obj = c.newInstance();
    retu