您是否使用(或定义)非标准注释,以及出于何种原因。递归注释怎么样?

时间:2009-04-08 14:19:59

标签: java annotations javac

问题告诉了所有人。

对于专家来说,SUN java 5编译器是否接受递归注释(与langspec相反)是有原因的,而后来的编译器却没有?我的意思是,可能是反对递归注释的参数。

编辑:递归注释类似于:

@Panel(layout=BorderLayout.class,
    nested={
        @Panel(region=NORTH, layout=FlowLayout.class, ...)
        @Panel(region=SOUTH, layout=FlowLayout.class, ...)
    }
)

4 个答案:

答案 0 :(得分:2)

首先 - 我不确定递归注释的含义。 您是指可以包含对同一类型的其他注释的引用的注释吗?像

这样的东西
@Panel(layout=BorderLayout.class,
    nested={
        @Panel(region=NORTH, layout=FlowLayout.class, ...)
        @Panel(region=SOUTH, layout=FlowLayout.class, ...)
    }
)

(如果可能的话,这将是我想使用它的一个例子......)

至于我使用自定义注释(和处理器):代码生成。

请参阅http://code.google.com/p/javadude/wiki/Annotations

例如,JavaBean属性:

@Bean(
    properties={    
      @Property(name="name"),
      @Property(name="phone", bound=true),
      @Property(name="friend", type=Person.class, kind=PropertyKind.LIST)
    }
)
public class Person extends PersonGen {
    // generated superclass PersonGen will contain getters/setters
    //    field definitions, property change support...
}

或混合示例

package sample;

import java.util.List;

public interface IFlightAgent {
    List<IFlight> getFlight();
    void reserve(IFlight flight);
}

public interface ICarAgent {
    List<ICar> getCars();
    void reserve(ICar car);
}

public interface IHotelAgent {
    List<IHotel> getHotels();
    void reserve(IHotel hotel);
}

package sample;

import com.javadude.annotation.Bean;
import com.javadude.annotation.Delegate;

@Bean(delegates = {
    @Delegate(type = IHotelAgent.class,
              property = "hotelAgent",
              instantiateAs = HotelAgentImpl.class),
    @Delegate(type = ICarAgent.class,
              property = "carAgent",
              instantiateAs = CarAgentImpl.class),
    @Delegate(type = IFlightAgent.class,
              property = "flightAgent",
              instantiateAs = FlightAgentImpl.class)
    }
)
public class TravelAgent extends TravelAgentGen
    implements IHotelAgent, ICarAgent, IFlightAgent
{
    // generated superclass TravelAgentGen will create instances
    //   of the "instantiateAs" classes and delegate the interface
    //   methods to them
}

有关其使用的一些潜在问题,请参阅The drawbacks of annotation processing in Java?及其对此的回答。

答案 1 :(得分:1)

我最近一直在使用注释,因为Oracle Weblogic Server大量使用它来修改Java Web服务的行为。他们定义了注释here的完整列表。特别是,我最终使用他们的Policy annotation,因为这是他们的安全模型所基于的;你可以在documentation page上看到他们的详细例子。

我从未听说过递归注释。

答案 2 :(得分:1)

我使用非标准注释,通常将类字段标记为自反过程的目标,例如RPC调用中的缓存或特定的初始化过程。 我从来不需要递归注释,但是......我认为这有一个潜在的问题,因为注释需要在类定义时处理,在标准初始化器准备好之前...我认为是主要的将注释内容限制为基类型的原因......

答案 3 :(得分:0)

我不知道任何反对允许递归注释的好论据,除了你可能偶然写的某些病态案例如果不被禁止可能会导致无限循环(在编译或运行时)。

javac禁止递归注释定义,因为这是规范所要求的。 在未来的JLS更新(例如,对于JDK 7)中应该所说的内容是另一回事。

请阅读并投票赞成:

http://bugs.sun.com/view_bug.do?bug_id=6264216