@Documented
@Retention(RetentionPolicy.RUNTIME)
public @interface Deprecated {
}上面是@Deprecated这个annotation的源码,编译器是怎么知道这个annotation是什么意思的。
要是我自定义的annotation怎么让编译器知道,我这个annotation是做什么的。

解决方案 »

  1.   

    软件包 java.lang.annotation 
    为 Java 编程语言注释设施提供库支持
    去看看吧!可能有帮助!
    其实Annotation 就是无数据<数据的数据>
      

  2.   

    反射里有对Annotation的支持,如果你自己定义了Annotation,可以通过反射来得到这些信息
      

  3.   

    自己的Annotation类,一个小小的demo@Documented
    @Target(ElementType.METHOD)
    @Retention(RetentionPolicy.RUNTIME)
    @Inherited
    public @interface Logger
    {
    String desc();

    }
    自定义的接口:
    /**
     * @author xKF17084
     *
     */
    public abstract interface UserInfoManage extends Manage
    {
    @Logger(desc = "删除用户信息")
    public void remove(Object user);
    }接口实现类:
    public class UserInfoManageImpl implements UserInfoManage
    {
    @Override
    public void register(Object user)
    {
    // TODO Auto-generated method stub
    System.out.println(((User)user).getUserName());
    } @Override
    public void update(Object user)
    {
    // TODO Auto-generated method stub
    System.out.println(((User)user).getUserName());
    } public void remove(Object user)
    {
    // TODO Auto-generated method stub
    System.out.println("remove : "+((User)user).getUserName());
    }
    拦截器类:
    public class DynamicProxyHandler implements InvocationHandler
    { Class busClass = null;
    /**
     * 生成一个代理类,此类是业务类和处理类合并后的类
     * @param busClass
     * @return
     */
    public Object bind(Class busClass)
    {
    this.busClass = busClass;
    return Proxy.newProxyInstance(busClass.getClassLoader(),
    busClass.getInterfaces(), this);
    }
    /* (non-Javadoc)
     * @see java.lang.reflect.InvocationHandler#invoke(java.lang.Object, java.lang.reflect.Method, java.lang.Object[])
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args)
    throws Throwable
    {
    // TODO Auto-generated method stub
    System.out.println("Invoke before!!!");
    boolean isAnn = method.isAnnotationPresent(Logger.class);

    if(isAnn)
    {
    Logger log = (Logger)method.getAnnotation(Logger.class);

    System.out.println("日志输出:---------->"+log.desc());
    System.out.println("=================================");
    }

    method.invoke(busClass.newInstance(), args);

    System.out.println("Invoke after!!!");
    return null;
    }

    /*public static void main(String[] args)
    {
    DynamicProxyHandler handler = new DynamicProxyHandler();
    BusinessInterface buss = new BusinessClass();
    buss = (BusinessInterface)handler.bind(buss);
    buss.doSomething();

    BusinessInterface buss2 = new BusinessClass();
    buss2 = (BusinessInterface)handler.bind(buss2);
    buss2.doSomething();
    }*/

    }
    主函数:
    public class MainClazz
    { /**
     * @param args
     */
    public static void main(String[] args)
    {
    // TODO Auto-generated method stub
    String clazzName = "com.demo.aop.bussManage.impl.UserInfoManageImpl";
    Map<String,Object> cachInstance = new HashMap<String,Object>();
    try
    {
    Class clazz = (Class) Class.forName(clazzName);
    DynamicProxyHandler handler = new DynamicProxyHandler();
    cachInstance.put("userInfoManage", handler.bind(clazz));

    UserInfoManage mange = (UserInfoManage)cachInstance.get("userInfoManage");

    User user = new User();
    user.setUserName("yajun");
    mange.remove(user);
    } catch (ClassNotFoundException e)
    {
    // TODO Auto-generated catch block
    e.printStackTrace();

    }}测试输出:
    Invoke before!!!
    日志输出:---------->删除用户信息
    =================================
    remove : yajun
    Invoke after!!!