corejava第10版
This commit is contained in:
1 parent
2021c3c227
commit
6165543dd3
1088 files changed
+94411
No files matched your search
@@ -0,0 +1,79 @@
|
||||
package sourceAnnotations;
|
||||
|
||||
import java.beans.*;
|
||||
import java.io.*;
|
||||
import java.util.*;
|
||||
|
||||
import javax.annotation.processing.*;
|
||||
import javax.lang.model.*;
|
||||
import javax.lang.model.element.*;
|
||||
import javax.tools.*;
|
||||
import javax.tools.Diagnostic.Kind;
|
||||
|
||||
@SupportedAnnotationTypes("sourceAnnotations.ToString")
|
||||
@SupportedSourceVersion(SourceVersion.RELEASE_8)
|
||||
public class ToStringAnnotationProcessor extends AbstractProcessor
|
||||
{
|
||||
@Override
|
||||
public boolean process(Set<? extends TypeElement> annotations,
|
||||
RoundEnvironment currentRound)
|
||||
{
|
||||
if (annotations.size() == 0) return true;
|
||||
try
|
||||
{
|
||||
JavaFileObject sourceFile = processingEnv.getFiler().createSourceFile("sourceAnnotations.ToStrings");
|
||||
try (PrintWriter out = new PrintWriter(sourceFile.openWriter())) {
|
||||
out.println("// Automatically generated by sourceAnnotations.ToStringAnnotationProcessor");
|
||||
out.println("package sourceAnnotations;");
|
||||
out.println("public class ToStrings {");
|
||||
|
||||
for (Element e : currentRound.getElementsAnnotatedWith(ToString.class)) {
|
||||
if (e instanceof TypeElement)
|
||||
{
|
||||
TypeElement te = (TypeElement) e;
|
||||
writeToStringMethod(out, te);
|
||||
}
|
||||
}
|
||||
out.println(" public static String toString(Object obj) {");
|
||||
out.println(" return java.util.Objects.toString(obj);");
|
||||
out.println(" }");
|
||||
out.println("}");
|
||||
}
|
||||
}
|
||||
catch (IOException ex)
|
||||
{
|
||||
processingEnv.getMessager().printMessage(Kind.ERROR, ex.getMessage());
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
private void writeToStringMethod(PrintWriter out, TypeElement te)
|
||||
{
|
||||
String className = te.getQualifiedName().toString();
|
||||
out.println(" public static String toString(" + className + " obj) {");
|
||||
ToString ann = te.getAnnotation(ToString.class);
|
||||
out.println(" StringBuilder result = new StringBuilder();");
|
||||
if (ann.includeName()) out.println(" result.append(\"" + className + "\");");
|
||||
out.println(" result.append(\"[\");");
|
||||
boolean first = true;
|
||||
for (Element c : te.getEnclosedElements())
|
||||
{
|
||||
String methodName = c.getSimpleName().toString();
|
||||
ann = c.getAnnotation(ToString.class);
|
||||
if (ann != null)
|
||||
{
|
||||
if (first) first = false; else out.println(" result.append(\",\");");
|
||||
if (ann.includeName())
|
||||
{
|
||||
String fieldName = Introspector.decapitalize(methodName.replaceAll("^(get|is)", ""));
|
||||
// Turn getWidth into width, isDone into done, getURL into URL
|
||||
out.println(" result.append(\"" + fieldName + "=" + "\");");
|
||||
}
|
||||
out.println(" result.append(toString(obj." + methodName + "()));");
|
||||
}
|
||||
}
|
||||
out.println(" result.append(\"]\");");
|
||||
out.println(" return result.toString();");
|
||||
out.println(" }");
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user