以下示例是对实际问题的简化,因为它试图尽可能地简化。
我有一个 java 接口,以及几个实现该接口的对象,例如:
public interface Shape{
public void draw();
public void erase();
public boolean isDrawn();
}
public class Square implements Shape{
@Override
public void draw(){
//TODO: method implementation
}
@Override
public void erase(){
//TODO: method implementation
}
Override
public boolean isDrawn(){
//TODO: method implementation
return false;
}
}
public Triangle implements Shape{
//same as above
}
public Circle implements Shape{
//same as above
}
这是我的程序的结构。通过使用 AspectJ,我想要一个映射来保存实现接口的每个对象。为此,我试图通过使用以下方面来捕获构造函数:
public aspect ShapeHolderAspect{
private Map<Integer, Shape> map = new HashMap<>();
private int count = 0;
pointcut shapeInit(): call((Shape+).new(..));
Object around(): shapeInit() {
System.out.println("capturing new");
Shape shapeType = (Shape)proceed();
map.put(++count, shapeType);
return shapeType;
}
}
如果我使用以下方案创建形状,则此代码将起作用:
public static void main(String[] args){
Shape myShape = new Circle();
}
但是,我使用的是 java 语言反射,所以从技术上讲,我不调用“新”构造函数。相反,我找到包的路径,并创建传递带有类名的字符串的对象:
public static void main(String[] args){
String shapeClassName = args[0];
Class<?> classType = Class.forName("myPackage.figures" + "." + shapeClassName);
Shape myShape =(Shape)classType.getConstructor().newInstance();
}
通过这样做,AspectJ 无法检测到我正在创建形状。我该如何解决?