EJB3笔记10-EJB3 Framwork:实作基于annotation生成代码

fancyh 2005-06-07 09:26:53
EJB3笔记10-EJB3 Framwork:实作基于annotation生成代码
Author fancyhf@163.com fancyhf.mblogger.cn

基于《笔记9》的理论,建立一个可以根据annotaion生成java代码的类。
首先,定义一个AnnotationProcessorFactory类TestApt.java。
/*
* This class is used to run an annotation processor that gen command class
* which annotation with CommandClass.
*/
public class TestApt implements AnnotationProcessorFactory {
// Process any set of annotations
private static final Collection<String> supportedAnnotations
= unmodifiableCollection(Arrays.asList("test.CommandClass"));

// No supported options
private static final Collection<String> supportedOptions = emptySet();

public Collection<String> supportedAnnotationTypes() {
return supportedAnnotations;
}

public Collection<String> supportedOptions() {
return supportedOptions;
}

public AnnotationProcessor getProcessorFor(
Set<AnnotationTypeDeclaration> atds,
AnnotationProcessorEnvironment env) {
return new TestApt Process(env);
}

private static class TestApt Process implements AnnotationProcessor {
private final AnnotationProcessorEnvironment env;

TestApt Process(AnnotationProcessorEnvironment env) {
this.env = env;
}

public void process() {
for (TypeDeclaration typeDecl : env.getSpecifiedTypeDeclarations()) {
typeDecl.accept(getDeclarationScanner(
new ListClassVisitor(env),
NO_OP));
}
}
// ListClassVisitor will process the CommandClass annotation in the given sorce file
private static class ListClassVisitor extends SimpleDeclarationVisitor {
private AnnotationProcessorEnvironment env = null;

public ListClassVisitor(AnnotationProcessorEnvironment env) {
super();
this.env = env;
}

// process all classes tha tag CommandClass
public void visitClassDeclaration(ClassDeclaration d) {
processCmdAnno(d,env);
}

//process all interfaces tha tag CommandClass
public void visitInterfaceDeclaration(InterfaceDeclaration d) {
processCmdAnno(d,env);
}

public String extractFullPakcageName(String className ) {
int index;

if( (index = className.lastIndexOf('.')) != -1 )
return className.substring(0, index);

return className;
}

public void processCmdAnno(TypeDeclaration d, AnnotationProcessorEnvironment env)
CommandClass ann = d.getAnnotation(CommandClass.class);
if (ann != null){
String clsName = d.getQualifiedName();
System.out.println("the clsName is " + clsName);
String packageName = extractFullPakcageName(clsName);
String className = d.getSimpleName();
for (MethodDeclaration f : d.getMethods()) {
Command annotation = f.getAnnotation( Command.class );
if (annotation != null) {
try {
PrintWriter writer =
env.getFiler().createSourceFile(
packageName + ".command." +
className);
writer.println("package "+getCommandPackageName() + ".command;");

writer.println("");
writer.println("//generated class,do not to remove it.");

writer.println("public final class " + getCommandClassName() + " implements Command {");
for (ParameterDeclaration pd : method.getParameters() ) {
String pkgName = "";
String typeName = "";
pkgName = EaUtil.extractFullPakcageName(pd.getType().toString());
typeName = EaUtil.extractNameFromClassName(pd.getType().toString());
System.out.println("the pkgName is " + typeName);
if (!importedPackage.contains(pkgName + ".*")) {
importedPackage.add(pkgName + ".*");
}
String tpName = "";
tpName = EaUtil.extractNameFromClassName(pd.getType().toString());
cnstrPm += tpName + " " + pd.getSimpleName() + ",";
pmValues += pd.getSimpleName() + ",";
writer.println("");
writer.println(" private " + tpName + " " + pd.getSimpleName()+";");
writer.println("");
writer.println(" public " + tpName + " get" + EaUtil.fstStrToUpperCase(pd.getSimpleName())
+ "() {");
writer.println(" return " + pd.getSimpleName() + ";");
writer.println(" }");
writer.println("");
writer.println(" public void set" + EaUtil.fstStrToUpperCase(pd.getSimpleName())
+ "(" + tpName + " " + pd.getSimpleName() +") {");
writer.println(" this." + pd.getSimpleName() + " = " + pd.getSimpleName() + ";");
writer.println(" }");
}
writer.println("}");
writer.close();
} catch (IOException oe) {
env.getMessager().printError(oe.getMessage());
}
}
}

}
}

}

}


...全文
83 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复
abstract (关键字) 抽象 ['æbstrækt] access vt.访问,存取 ['ækses]'(n.入口,使用权) algorithm n.算法 ['ælgәriðm] Annotation [java] 代码注释 [ænәu'teiʃәn] anonymous adj.匿名的[ә'nɒnimәs]'(反义:directly adv.直接地,立即[di'rektli, dai'rektli]) apply v.应用,适用 [ә'plai] application n.应用,应用程序 [,æpli'keiʃәn]' (application crash 程序崩溃) arbitrary a.任意的 ['ɑ:bitrәri] argument n.参数;争论,论据 ['ɑ:gjumәnt]'(缩写 args) assert (关键字) 断言 [ә'sә:t] ' (java 1.4 之后成为关键字) associate n.关联(同伴,伙伴) [ә'sәuʃieit] attribute n.属性(品质,特征) [ә'tribju:t] boolean (关键字) 逻辑的, 布尔型 call n.v.调用; 呼叫; [kɒ:l] circumstance n.事件(环境,状况) ['sә:kәmstәns] crash n.崩溃,破碎 [kræʃ] cohesion 内聚,黏聚,结合 [kәu'hi:ʒәn] (a class is designed with a single, well-focoused purpose. 应该不止这点) command n. 命令,指令 [kә'mɑ:nd](指挥, 控制) (command-line 命令行) Comments [java] 文本注释 ['kɒments] compile [java] v.编译 [kәm'pail]' Compilation n.编辑[,kɒmpi'leiʃәn] const (保留字) constant n. 常量, 常数, 恒量 ['kɒnstәnt] continue (关键字) coupling 耦合,联结 ['kʌpliŋ] making sure that classes know about other classes only through their APIs. declare [java] 声明 [di'klєә] default (关键字) 默认值; 缺省值 [di'fɒ:lt] delimiter 定义符; 定界符 Encapsulation[java] 封装 (hiding implementation details) Exception [java] 例外; 异常 [ik'sepʃәn] entry n.登录项, 输入项, 条目['entri] enum (关键字) execute vt.执行 ['eksikju:t] exhibit v.显示, 陈列 [ig'zibit] exist 存在, 发生 [ig'zist] '(SQL关键字 exists) extends (关键字) 继承、扩展 [ik'stend] false (关键字) final (关键字) finally (关键字) fragments 段落; 代码块 ['frægmәnt] FrameWork [java] 结构,框架 ['freimwә:k] Generic [java] 泛型 [dʒi'nerik] goto (保留字) 跳转 heap n.堆 [hi:p] implements (关键字) 实现 ['implim

67,512

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧