public class MyCalculator { boolean isReady; @TOFORMATE double concurrency; @TOFORMATE Date debitDate; public MyCalculator() { super(); }
@TODO public void calculateRate(){ System.out.println("Calculating..."); } }
清单15动态查找注释
public class TestCalculator { public static void main(String[] args) { MyCalculator cal = new MyCalculator(); cal.calculateRate(); try { Class c = cal.getClass(); Method[] methods = c.getDeclaredMethods();
for (Method m: methods) { // 判定这个方法有没有使用TODO if (m.isAnnotationPresent(TODO.class)) System.out.println("Method "+m.getName()+": the TODO is present"); }
Field[] fields = c.getDeclaredFields(); for (Field f : fields) { // 判定这个域有没有使用TOFORMATE if (f.isAnnotationPresent(TOFORMATE.class)) System.out.println ("Field "+f.getName()+": the TOFORMATE is present"); } } catch (Exception exc) { exc.printStackTrace(); } } }
图7种给出visit方法的实现是一个简单的例子。假如要实现输出成xml格式的,可以定义Exporter子类:XMLExporter。假如希望输出成文本的可以定义TXTExporter。但是这样做不够灵活的地方在于,假如Employee加入其他的域变量,那么相应的visitor类也需要进行修改。这就违反了面向对象Open for Extension, close for Modification的原则。