рдХрд╕реНрдЯрдо рдПрдиреЛрдЯреЗрд╢рди рдкреНрд░реАрдкреНрд░реЛрд╕реЗрд╕рд░ - Android- рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдФрд░ рдЗрдВрдЯреЗрд▓реАрдЬ рдЖрдИрдбреАрдИрдП рдореЗрдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдирд┐рд░реНрдорд╛рдг

рд╕рднреА рдХреЛ рдирдорд╕реНрдХрд╛рд░!

рд╣рд╛рд▓ рд╣реА рдореЗрдВ, рдореБрдЭреЗ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдХрд╕реНрдЯрдо рдПрдиреЛрдЯреЗрд╢рди рд▓рд┐рдЦрдиреЗ рдФрд░ рд╕рдВрдХрд▓рди рдХреЗ рджреМрд░рд╛рди рдЙрдиреНрд╣реЗрдВ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рдХрд╛рд░реНрдп рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛ред рдкрд╣рд▓рд╛ рд╕рд╡рд╛рд▓ рдореИрдВрдиреЗ рдЦреБрдж рд╕реЗ рдкреВрдЫрд╛: рдХрд╣рд╛рдВ рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВ? рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рдмрд╛рдж, рдореИрдВрдиреЗ рдЖрдкрдХреЗ рд╕рд╛рде рдЗрд╕ рдкреНрд░рд╢реНрди рдХрд╛ рдЙрддреНрддрд░ рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдмрддрд╛рдиреЗ рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЬрд╛рд╡рд╛ рдореЗрдВ рдХреНрдпрд╛ рдПрдиреЛрдЯреЗрд╢рди рд╣реИрдВ рдФрд░ рдЙрдирдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдЦрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рд░ рдпреБрд╡рд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдЗрд╕рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИ (рдФрд░ рдЬреЛ рдЗрд╕рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рдирд╣реАрдВ рд╣реИ, рд╡рд╣ рдЗрд╕реЗ рдЕрдкрдиреЗ рджрдо рдкрд░ рдкрдврд╝ рд╕рдХрддрд╛ рд╣реИ)ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╕ рдШрдЯрдирд╛ рдкрд░ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рддрдереНрдп-рдЦреЛрдЬ рд▓реЗрдЦ рд╣реИред
рд▓реЗрдХрд┐рди рдЖрдЬ рдореИрдВ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдПрдВрдбреНрд░реЙрдЗрдб рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдХрд╕реНрдЯрдо рдПрдиреЛрдЯреЗрд╢рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдЬреЛ рдЖрдкрдХреЗ рдЕрдкрдиреЗ рд╣реИрдВрдбрд▓рд░ рджреНрд╡рд╛рд░рд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд╕рдВрдХрд▓рди рдХреЗ рджреМрд░рд╛рди рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдЙрди рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдСрдЯреЛ-рдкреАрдврд╝реА рдХреА рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВред рдФрд░ рдЗрд╕рдХреЗ рд╕рд╛рде рд╣реА, рдореИрдВ рдЖрдкрдХреЛ рдмрддрд╛рддрд╛ рд╣реВрдВ рдХрд┐ рдХреИрд╕реЗ рдЬрд▓реНрджреА рд╕реЗ рд╕рдм рдХреБрдЫ IDEA рдореЗрдВ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдП (рдореИрдВ рдЦреБрдж рд╕рдВрд╕реНрдХрд░рдг 12.1 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рд╢рд╛рдпрдж рджреВрд╕рд░реЛрдВ рдореЗрдВ рдорддрднреЗрдж рд╣реИрдВ)ред

рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ 2 рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ: рдкрд╣рд▓реЗ рдореЗрдВ, рд╣рдо рдЕрдкрдиреЗ рдХрд╕реНрдЯрдо рдПрдиреЛрдЯреЗрд╢рди рдФрд░ рдЙрдирдХреЗ рд╣реИрдВрдбрд▓рд░ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реЗрдВрдЧреЗ, рдЗрд╕рдореЗрдВ рд╕реЗ рд╣рдо рдПрдХ рдЬрд╛рд░ рдлрд╛рдЗрд▓ рддреИрдпрд╛рд░ рдХрд░реЗрдВрдЧреЗ, рдЬрд┐рд╕реЗ рд╣рдо рджреВрд╕рд░реЗ рдЯреЗрд╕реНрдЯ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВрдЧреЗ, рдЬреЛ рд╣рдорд╛рд░реЗ рдПрдиреЛрдЯреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛ред

рдЪрд░рдг 1

рд╣рдо рдПрдХ рдирдпрд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдЕрдкрдиреЗ рдПрдиреЛрдЯреЗрд╢рди рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВред рдПрдХ рдПрдиреЛрдЯреЗрдЯ рд╡рд░реНрдЧ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

@Target(ElementType.METHOD) @Retention(RetentionPolicy.SOURCE) public @interface CustomAnnotation { String className(); String value() default "Hello"; int type() default 0; } 


@ рд░рд┐рдЯреЗрдВрд╢рди рдХрд╣рддрд╛ рд╣реИ рдХрд┐ рд╣рдорд╛рд░рд╛ рдПрдиреЛрдЯреЗрд╢рди рдХреЗрд╡рд▓ рд╕реЛрд░реНрд╕ рдХреЛрдб рдореЗрдВ рдореМрдЬреВрдж рд╣реЛрдЧрд╛ рдФрд░ рдХрдВрдкрд╛рдЗрд▓рд░ рджреНрд╡рд╛рд░рд╛ рдЦрд╛рд░рд┐рдЬ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ (рдФрд░ рдЙрд╕ рдХреНрд╖рдг рддрдХ рд╣рдо рдЗрд╕реЗ рдкреНрд░реЛрд╕реЗрд╕ рдХрд░реЗрдВрдЧреЗ)ред

рдЪрд░рдг 2

рд╣рдо рд╕реАрдзреЗ рдЕрдкрдирд╛ рдПрдиреЛрдЯреЗрд╢рди рдкреНрд░реЛрд╕реЗрд╕рд░ рдмрдирд╛рддреЗ рд╣реИрдВред рдпрд╣ рдПрдХ рд╡рд░реНрдЧ рд╣реИ рдЬреЛ AbstractProcessor рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рддрд╛ рд╣реИред рд╣рдо рдЙрд╕реЗ рдмрддрд╛рддреЗ рд╣реИрдВ рдХрд┐ рд╡рд╣ рд╕рднреА рдПрдиреЛрдЯреЗрд╢рди рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░реЗрдЧрд╛ рдФрд░ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╕реНрд░реЛрдд рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд╕рдорд░реНрдерд┐рдд рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░реЗрдЧрд╛:

 @SupportedAnnotationTypes({"*"}) @SupportedSourceVersion(SourceVersion.RELEASE_6) public class CustomProcessor extends AbstractProcessor { } 

рдЕрдЧрд▓рд╛, рд╣рдо рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╡рд┐рдзрд┐ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдПрдХ рдирдпрд╛ рд╡рд░реНрдЧ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддрд░реНрдХ рд▓рд┐рдЦрддреЗ рд╣реИрдВред рдореЗрд░рд╛ рддрд░реАрдХрд╛ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

 @Override public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) { for (Element e : roundEnv.getElementsAnnotatedWith(CustomAnnotation.class)) { CustomAnnotation ca = e.getAnnotation(CustomAnnotation.class); String name = e.getSimpleName().toString(); char[] c = name.toCharArray(); c[0] = Character.toUpperCase(c[0]); name = new String(name); TypeElement clazz = (TypeElement) e.getEnclosingElement(); try { JavaFileObject f = processingEnv.getFiler(). createSourceFile(clazz.getQualifiedName() + "Autogenerate"); processingEnv.getMessager().printMessage(Diagnostic.Kind.NOTE, "Creating " + f.toUri()); Writer w = f.openWriter(); try { String pack = clazz.getQualifiedName().toString(); PrintWriter pw = new PrintWriter(w); pw.println("package " + pack.substring(0, pack.lastIndexOf('.')) + ";"); pw.println("\npublic class " + clazz.getSimpleName() + "Autogenerate {"); TypeMirror type = e.asType(); pw.println("\n public " + ca.className() + " result = \"" + ca.value() + "\";"); pw.println(" public int type = " + ca.type() + ";"); pw.println("\n protected " + clazz.getSimpleName() + "Autogenerate() {}"); pw.println("\n /** Handle something. */"); pw.println(" protected final void handle" + name + "(" + ca.className() + " value" + ") {"); pw.println("\n//" + e); pw.println("//" + ca); pw.println("\n System.out.println(value);"); pw.println(" }"); pw.println("}"); pw.flush(); } finally { w.close(); } } catch (IOException x) { processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, x.toString()); } } return true; } 

рдЗрд╕ рд╕реНрддрд░ рдкрд░, рдЖрдк рдХрд▓реНрдкрдирд╛ рдХреЛ рдЪрд╛рд▓реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдкрдХреА рджрд┐рд▓ рдХреА рдЗрдЪреНрдЫрд╛рдПрдВ (рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ, рдпрд╛ рдХреНрдпрд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ =)ред рдЬрдм рдЖрдк рдПрдиреЛрдЯреЗрд╢рди рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдЕрдкрдиреЗ рд╕рднреА рдХрд╕реНрдЯрдо рдПрдиреЛрдЯреЗрд╢рди рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдЗрд╕ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реЗ рдПрдХ рдЬрд╛рд░ рдлрд╝рд╛рдЗрд▓ рдЬреЗрдирд░реЗрдЯ рдХрд░рдиреА рд╣реЛрдЧреАред рдЖрдЗрдбрд┐рдпрд╛ 12 рдореЗрдВ, рдпрд╣ рдХрд╛рдлреА рд╕рд░рд▓рддрд╛ рд╕реЗ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ: рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ -> рдХрд▓рд╛рдХреГрддрд┐рдпрд╛рдВ -> рдРрдб -> рдЬрд╛рд░ -> рдореЙрдбреНрдпреВрд▓ рд╕реЗ ... рдЕрдЧрд▓рд╛, рдмрд┐рд▓реНрдб -> рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХрд╛ рдкреБрдирд░реНрдирд┐рд░реНрдорд╛рдг рдХрд░реЗрдВ рдФрд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдореЗрдВ рд╣рдорд╛рд░реА рдЙрддреНрдкрдиреНрди рдЬрд╛рд░ рдлрд╝рд╛рдЗрд▓ рдвреВрдВрдвреЗрдВред

рдЪрд░рдг 3

рд╣рдо рдПрдХ рдкрд░реАрдХреНрд╖рдг рдкрд░рд┐рдпреЛрдЬрдирд╛ рдмрдирд╛рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдЕрдкрдиреЗ рдХрд╕реНрдЯрдо рдПрдиреЛрдЯреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рд╣рдо рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рдЕрдВрддрд┐рдо рдЪрд░рдг рдореЗрдВ рдЙрддреНрдкрдиреНрди рдЬрд╛рд░ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдХрдиреЗрдХреНрдЯ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЦреБрд╢реА рд╣реЛрддреА рд╣реИ рдХрд┐ рдЕрдм рд╣рдорд╛рд░реЗ рдПрдиреЛрдЯреЗрд╢рди рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЙрдкрд▓рдмреНрдз рд╣реИрдВред рдХрд┐рд╕реА рднреА рд╡рд░реНрдЧ рдореЗрдВ, рд╣рдорд╛рд░реЗ рдПрдиреЛрдЯреЗрд╢рди рдХреЛ рд▓рд┐рдЦреЗрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
 public class MyActivity extends Activity { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } @CustomAnnotation(className = "String", type = 1) public void annotatedMethod(String value) { } } 

рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рд╣рдордиреЗ рдЕрдкрдиреЗ рдПрдиреЛрдЯреЗрд╢рди @Target(ElementType.METHOD) рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╣рдо рдХреЗрд╡рд▓ рд╡рд┐рдзрд┐ рд╕реЗ рдкрд╣рд▓реЗ рдЗрд╕реЗ рдкрдВрдЬреАрдХреГрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЪрд░рдг 4

рдЕрдм рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рдЖрдЗрдбрд┐рдпрд╛ рд╣рдорд╛рд░реЗ рдПрдиреЛрдЯреЗрд╢рди рдкреНрд░реЛрд╕реЗрд╕рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЬрд╛рджреВ рдХрд╛рдо рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрдЧрд╛! рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХрдВрдкрд╛рдЗрд▓рд░ -> рдПрдиреЛрдЯреЗрд╢рди рдкреНрд░реЛрд╕реЗрд╕рд░ рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдкрд░ рдЬрд╛рдПрдВред рд╣рдо рдПрдиреЛрдЯреЗрд╢рди рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рддреЗ рд╣реИрдВ , рдкреНрд░реЛрд╕реЗрд╕рд░ рдкрде рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд╣рдорд╛рд░реА рдЙрддреНрдкрдиреНрди рдЬрд╛рд░ рдлрд╝рд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рдкрде рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдкреНрд░реЛрд╕реЗрд╕рд░ FQ рдирд╛рдо рд╡рд┐рдВрдбреЛ рдореЗрдВ, рдЙрд╕ рд╡рд░реНрдЧ рдХрд╛ рдкреВрд░рд╛ рдирд╛рдо рджрд░реНрдЬ рдХрд░реЗрдВ рдЬреЛ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдПрдХ рдХрд╕реНрдЯрдордкреНрд░реЛрд╕реЗрд╕рд░ рд╣реИред рднрд░реА рд╣реБрдИ рдЦрд┐рдбрд╝рдХреА рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрдиреА рдЪрд╛рд╣рд┐рдПред



рдЪрд░рдг 5

рд╣рдо рдмрд┐рд▓реНрдб -> рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХрд╛ рдкреБрдирд░реНрдирд┐рд░реНрдорд╛рдг рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХрд╛ рдЖрдирдВрдж рд▓реЗрддреЗ рд╣реИрдВред рдЙрддреНрдкрдиреНрди рдлрд╝реЛрд▓реНрдбрд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЯреНрд░реА рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрд┐рд╕рдореЗрдВ рдирдИ рдлрд╛рдЗрд▓реЗрдВ рдЭреВрда рд╣реЛрдВрдЧреАред
рдпрд╣рд╛рдБ рдореБрдЭреЗ рдХреНрдпрд╛ рдорд┐рд▓рд╛ рд╣реИ:

 public class MyActivityAutogenerate { public String result = "Hello"; public int type = 1; protected MyActivityAutogenerate() {} /** Handle something. */ protected final void handleannotatedMethod(String value) { //annotatedMethod(java.lang.String) //@com.example.AnnotationsProcessor.CustomAnnotation(type=1, value=Hello, className=String) System.out.println(value); } } 


рд╣реИрдкреНрдкреА рдХреЛрдбрд┐рдВрдЧ!

Source: https://habr.com/ru/post/In200354/


All Articles