栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

实施注释的用例

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

实施注释的用例

我从没有在实践中使用过它,但是得到的是,您可以使用类代替注释。

让我们创建一个人工的例子。假设我们有一个文档生成器。它

@Docu
从给定的类中读取注释并打印
description
属性。像这样:

import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;import java.util.ArrayList;import java.util.List;public class DokuGenerator {    public static void main(String[] args) throws Exception {        new DokuGenerator(StaticClass.class, StaticClass2.class);    }    public DokuGenerator(Class<?>... classesToDokument) throws Exception {        List<Docu> documentAnnotations = getdocumentAnnotations(classesToDokument);        printdocumentation(documentAnnotations);    }    private List<Docu> getdocumentAnnotations(Class<?>... classesToDokument) throws Exception {        List<Docu> result = new ArrayList<Docu>();        for (Class<?> c : classesToDokument) if (c.isAnnotationPresent(Docu.class))     result.add(c.getAnnotation(Docu.class));        return result;    }    private void printdocumentation(List<Docu> todocument) {        for (Docu m : todocument) System.out.println(m.description());    }}@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@interface Docu {    String description();}@Docu(description = "This is a static class!")class StaticClass {}@Docu(description = "This is another static class!")class StaticClass2 {}

印刷品:

This is a static class!  This is another static class!

我们现在想要完成的是,一个类不仅可以被静态注释,而且可以将运行时信息添加到文档中。

@Docu
大多数时候我们很高兴使用注释,但是在某些特殊情况下,我们需要特殊的文档。我们可能想为某些方法添加性能文档。我们可以通过让一个类实现注释来做到这一点。生成器首先检查注释,如果不存在,则检查类是否实现了注释。如果是这样,它将类添加到注释列表中。

像这样(生成器中只有两行代码):

import java.lang.annotation.Annotation;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;import java.util.ArrayList;import java.util.Arrays;import java.util.List;public class DokuGenerator {    public static void main(String[] args) throws Exception {        new DokuGenerator(StaticClass.class, StaticClass2.class,     DynamicClass.class);    }    public DokuGenerator(Class<?>... classesToDokument) throws Exception {        List<Docu> documentAnnotations = getdocumentAnnotations(classesToDokument);        printdocumentation(documentAnnotations);    }    private List<Docu> getdocumentAnnotations(Class<?>... classesToDokument) throws Exception {        List<Docu> result = new ArrayList<Docu>();        for (Class<?> c : classesToDokument) if (c.isAnnotationPresent(Docu.class))     result.add(c.getAnnotation(Docu.class)); else if (Arrays.asList(c.getInterfaces()).contains(Docu.class))     result.add((Docu) c.newInstance());        return result;    }    private void printdocumentation(List<Docu> todocument) {        for (Docu m : todocument) System.out.println(m.description());    }}@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@interface Docu {    String description();}@Docu(description = "This is a static class!")class StaticClass {}@Docu(description = "This is another static class!")class StaticClass2 {}class DynamicClass implements Docu {    public DynamicClass() {        try { Thread.sleep((long) (Math.random() * 100));        } catch (InterruptedException e) { // ignore exception to make debugging a little harder        }    }    @Override    public String description() {        long millis = System.currentTimeMillis();        new DynamicClass();        millis = System.currentTimeMillis() - millis;        return "This is a dynamic class. I run on "     + System.getProperty("os.name")     + ". The construction of an instance of this class run for "     + millis + " milliseconds.";    }    @Override    public Class<? extends Annotation> annotationType() {        return Docu.class;    }}

输出为:

This is a static class!  This is another static class!  This is a dynamic class. I run on Windows XP. The construction of an instance of this class run for 47 milliseconds.

您没有太多更改代码生成器,因为您可以使用该类代替注释。

其他示例谁可能是使用注释或XML作为配置的框架。您可能有一个处理注释的处理器。如果使用XML作为配置,则可以生成实现注释的类的实例,并且您的处理器可以对它们进行处理,而无需进行任何更改!(当然,还有其他方法可以达到相同的效果,但这是一种实现方法)



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/469954.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号