System.out.println(“Draw a Rectangle”);
}
}
public class Triangle implements IShape {
@Override
public void draw() {
System.out.println(“Draw a Triangle”);
}
}
public class Circle implements IShape {
@Override
public void draw() {
System.out.println(“Draw a circle”);
}
}
接下来我们需要一个工厂类,这个类接收一个参数,根据我们传入的参数创建出对应的形状,代码如下:
public class ShapeFactory {
public Shape create(String id) {
if (id == null) {
throw new IllegalArgumentException(“id is null!”);
}
if (“Circle”.equals(id)) {
return new Circle();
}
if (“Rectangle”.equals(id)) {
return new Rectangle();
}
if (“Triangle”.equals(id)) {
return new Triangle();
}
throw new IllegalArgumentException("Unknown id = " + id);
}
}
以上就是一个简单工厂模式的示例代码,想必大家都能够理解。
那么,现在问题来了,在项目开发过程中,我们随时可能会添加一个新的形状。此时就不得不修改工厂类来适配新添加的形状了。试想一下,每添加一个形状类都需要我们手动去更新Factory类,是不是影响了我们的开发效率?如果这个Factory类能够根据我们添加新的形状来同步更新Factory代码,岂不是就省了我们很多时间了吗?
应该怎么做才能满足上述需求呢?在第一节中已经提到了使用APT可以帮助我们自动生成代码。那么这个工厂类是不是可以使用APT技术来自动生成呢?我们唯一要做的事情就是新添加的形状类上加上一个注解,注解处理器就会在编译时根据注解信息自动生成ShapeFactory类的代码了,美哉,美哉!理想很丰满,但是,现实很骨感。虽然已经明确了要做什么,但是想要注解处理器帮我们生成代码,却还有很长的路要走。不过,不当紧,接下来我们将一步步实现注解处理器并让其自动生成Factory类。
三、使用APT处理注解
1.定义Factory注解
首先在annotation模块下添加一个Factory的注解,Factory注解的Target为ElementType,表示它可以注解类、接口或者枚举。Retention指定为RetentionPolicy.CLASS,表示该在字节码中有效。Factory注解添加两个成员,一个Class类型的type,用来表示注解的类的类型,相同的类型表示属于同一个工厂。令需一个String类型的id,用来表示注解的类的名称。Factory注解代码如下:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.CLASS)
public @interface Factory {
Class type();
String id();
}
接下来我们用@Factory去注解形状类,如下:
@Factory(id = “Rectangle”, type = IShape.class)
public class Rectangle implements IShape {
@Override
public void draw() {
System.out.println(“Draw a Rectangle”);
}
}
//… 其他形状类代码类似不再贴出
**2.认识AbstractProcessor **
接下来,就到了我们本篇文章所要讲的核心了。没错,就是AbstractProcessor&#x