最近自己做了一个项目。有一部分是通过不同的业务,调用相同一个类的不同方法产生XML文件。
我刚开始的想法就是简单的通过工厂方法,例如
if("a".equals(Type))
{
a方法
}
if("b".equals(Type))
{
b方法
}
由于项目中的类型越来越多造成难以维护。后来为了扩展的方便,采用放射的方式。
例如:
首先是一个接口
public interface XmlFactory {
public boolean createXml();
}
然后是他的两个实现类
public class DicBaseXml implements XmlFactory {
String name;
String path;
public DicBaseXml(String name,String path)
{
this.name = name;
this.path = path;
}
public boolean createXml() {
System.out.println(name+":"+path+":dicbase");
return false;
}
}
public class GroupXml implements XmlFactory {
String name;
String path;
public GroupXml(String name,String path)
{
this.name = name;
this.path = path;
}
public boolean createXml() {
System.out.println(name+":"+path+":group");
return false;
}
}
测试类
import java.lang.reflect.Constructor;
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
String className = "GroupXml";
print(className);
}
public static void print(String className)
{
try {
Class clazz = Class.forName(className);
Constructor constructor = clazz.getConstructor(String.class,
String.class); // 构造函数参数列表的class类型
XmlFactory test = (XmlFactory) constructor.newInstance("boss","1.txt"); // 传参
System.out.println(test.createXml());
} catch (Exception e) {
e.printStackTrace();
}
}
}
Java语言反射提供一种动态链接程序组件的多功能方法。它允许程序创建和控制任何类的对象(根据安全性限制),无需提前硬编码目标类。这些特性使得反射特别适用于创建以非常普通的方式与对象协作的库。例如,反射经常在持续存储对象为数据库、XML或其它外部格式的框架中使用。Java reflection 非常有用,它使类和数据结构能按名称动态检索相关信息,并允许在运行着的程序中操作这些信息。Java 的这一特性非常强大,并且是其它一些常用语言,如 C、C++、Fortran 或者 Pascal 等都不具备的。
但反射有两个缺点。第一个是性能问题。用于字段和方法接入时反射要远慢于直接代码。性能问题的程度取决于程序中是如何使用反射的。如果它作为程序运行中相对很少涉及的部分,缓慢的性能将不会是一个问题。即使测试中最坏情况下的计时图显示的反射操作只耗用几微秒。仅反射在性能关键的应用的核心逻辑中使用时性能问题才变得至关重要。
(因为该部分并不实际参与系统的逻辑部分,所以我考虑使用反射来做)
许多应用中更严重的一个缺点是使用反射会模糊程序内部实际要发生的事情。程序人员希望在源代码中看到程序的逻辑,反射等绕过了源代码的技术会带来维护问题。反射代码比相应的直接代码更复杂,正如性能比较的代码实例中看到的一样。解决这些问题的最佳方案是保守地使用反射——仅在它可以真正增加灵活性的地方——记录其在目标类中的使用