рд╣рд╛рд▓ рд╣реА рдореЗрдВ, рдореИрдВрдиреЗ рдПрдВрдбреНрд░реЙрдЗрдб рдХреЗ рд▓рд┐рдП рдПрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛ рдФрд░ рдореБрдЭреЗ рдЗрд╕реЗ рд░рд┐рд╡рд░реНрд╕ рд╕реЗ рдмрдЪрд╛рдиреЗ рдХрд╛ рдХрд╛рдо рдорд┐рд▓рд╛ред Google рдиреЗ рддреНрд╡рд░рд┐рдд рд░реВрдк рд╕реЗ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ рдХрд┐ ProGuard, рдЬреЛ рдХрд┐ рдПрдВрдбреНрд░реЙрдЗрдб рд╕реНрдЯреВрдбрд┐рдпреЛ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ, рдХрд╛рд░реНрдп рдХреЗ рд╕рд╛рде рд╕рд╛рдордирд╛ рдХрд░реЗрдЧрд╛ред рдкрд░рд┐рдгрд╛рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореБрдЭреЗ рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рд╡рд┐рд╕реНрддрд╛рд░ рдХреЗ рдЕрдкрд╡рд╛рдж рдХреЗ рд╕рд╛рде рдЙрдкрдпреБрдХреНрдд рдерд╛ - рд░реЗрдЦрд╛ред
рдХрд╛рд░реНрдпрдХреНрд░рдо рдЗрдВрдЯреЗрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реЗрд╡рд╛ рдХреЗ рд╕рд╛рде рд╕реВрдЪрдирд╛ рдХрд╛ рдЖрджрд╛рди-рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдЬрд┐рд╕рдХрд╛ рдкреНрд░рдореБрдЦ рд╣рд┐рд╕реНрд╕рд╛ рдПрдХреНрд╢рди рд▓рд╛рдЗрди рд╣реИред рдФрд░ рдЕрдЧрд░ рд╕рд┐рд╕реНрдЯрдо рдпрд╛ рдЕрдиреНрдп рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рдкрд╛рд╕ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдкреНрд░рд╛рд░реВрдк рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рддреЛ рдЖрд╡реЗрджрди рдХреЗ рдЕрдВрджрд░ рдЖрджрд╛рди-рдкреНрд░рджрд╛рди рдХреЗ рд▓рд┐рдП, рдЗрд╕рдХреА рд╡рд┐рд╢рд┐рд╖реНрдЯрддрд╛ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЕрдиреБрд╢рдВрд╕рд╛ рдХреА рдЬрд╛рддреА рд╣реИ рдХрд┐ рдпрд╣ рд░реЗрдЦрд╛ рдкреИрдХреЗрдЬ рдирд╛рдо рдФрд░ рдХреНрд░рд┐рдпрд╛ рдирд╛рдо рд╕реЗ рдмрдиреА рд╣реЛред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
public final class HandlerConst { public static final String ACTION_LOGIN = "com.example.app.ACTION_LOGIN"; }
рдпрд╣ рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЛрдб рдХреА рдЧреБрдгрд╡рддреНрддрд╛ рдХреЛ рдмрд╣реБрдд рдХрдо рдХрд░рддрд╛ рд╣реИред рдореИрдВ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рд░рд┐рд▓реАрдЬ рдореЗрдВ рдЗрд╕ рд▓рд╛рдЗрди рдХреЗ рдмрдЬрд╛рдп рдЗрд╕рдХреЗ рдПрдордбреА 5 рд╣реИрд╢ рдХреЛ рджреЗрдЦрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред
public final class HandlerConst { public static final String ACTION_LOGIN = "7f315954193d1fd99b017081ef8acdc3"; }
рдХрдЯ рдХреЗ рддрд╣рдд, рдпрд╣ рд╡рд░реНрдгрд┐рдд рд╣реИ рдХрд┐ рд╣рд╛рде рдореЗрдВ рд╕рд╛рдЗрдХрд┐рд▓ рдХреА рдорджрдж рд╕реЗ рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рдПред
рдХреБрдЫ рдЧреАрдд
рдореБрдЭреЗ рдпрд╣ рдЬрд╛рдирдХрд░ рдмрд╣реБрдд рдЖрд╢реНрдЪрд░реНрдп рд╣реБрдЖ рдХрд┐ рдкреНрд░реЛрдЧрд╛рд░реНрдб рддрд╛рд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд╡реЗрдмрд╕рд╛рдЗрдЯ рдкрд░ рдкреНрд░рд▓реЗрдЦрди рд╕реЗ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рд╕рдВрднрд╡ рдерд╛ рдХрд┐ рдПрдХ рдЙрдиреНрдирдд рднреБрдЧрддрд╛рди рд╕рдВрд╕реНрдХрд░рдг рддрд╛рд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИред рдпрд╣ рдХреЗрд╡рд▓ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдЪрд╛рд▓реВ рдХрд░рддреЗ рд╕рдордп рдореВрд▓ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдбрд┐рдХреНрд░рд┐рдкреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЛ рдПрдиреНрдХреНрд░рд┐рдкреНрдЯ рдХрд░рддрд╛ рд╣реИред рдореБрдЭреЗ рдЗрд╕рдХреЗ рдПрдордбреА 5 рдореВрд▓реНрдп рдореЗрдВ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдмрджрд▓рдиреЗ рдХрд╛ рдХреЛрдИ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рдорд┐рд▓рд╛ред
рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╣рд▓ рдЦреЛрдЬрдиреЗ рдХреЗ рдкреНрд░рдпрд╛рд╕реЛрдВ рдиреЗ рдореБрдЭреЗ C ++ рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЗ рдЕрдиреБрдХреВрд▓рди рдХреЗ рдЪрдорддреНрдХрд╛рд░ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдПрдХ рд▓реЗрдЦ рдХреА рдУрд░ рдЕрдЧреНрд░рд╕рд░ рдХрд┐рдпрд╛:
рд╕рдВрдХрд▓рди-рд╕рдордп рдореЗрдВ CRC32 рд▓рд╛рдЗрдиреЛрдВ рдХрд╛ рд╕рдВрдХрд▓рди ред рд▓реЗрдХрд┐рди рдЬрд╛рд╡рд╛ рдореЗрдВ, рдПрдХ рд╕рдорд╛рди рд╡рд┐рдзрд┐ рдиреЗ рдирд╣реАрдВ рд▓рд┐рдпрд╛ред ProGuard рдиреЗ рддрд░реАрдХреЛрдВ рдХреЛ рдереЛрдбрд╝рд╛ рдХрдо рдХрд░ рджрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╕реЗ рдмрд╛рдЗрдЯреНрд╕ рдХреА рдПрдХ рд╕рд░рдгреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдкрд░ рдареЛрдХрд░ рдЦрд╛рдИред
рдЙрд╕рдХреЗ рдмрд╛рдж, рдореИрдВрдиреЗ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдХрд┐ рдореИрдВ рд╕рдордп рдХреЛ рдмрд░реНрдмрд╛рдж рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛ рдФрд░ рдмрд╕ рдЕрдкрдиреЗ рд╣рд╛рдереЛрдВ рд╕реЗ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░реВрдВрдЧрд╛:
public final class HandlerConst { public static final String ACTION_LOGIN; static { if (BuildConfig.DEBUG) ACTION_LOGIN = "com.example.app.ACTION_LOGIN"; else ACTION_LOGIN = "7f315954193d1fd99b017081ef8acdc3"; } }
рд▓реЗрдХрд┐рди рдЬрдм рдореИрдВрдиреЗ рд╣рдм рдкрд░
рдХрд╕реНрдЯрдо рдПрдиреЛрдЯреЗрд╢рди рдкреНрд░реАрдкреНрд░реЛрд╕реЗрд╕рд░ рд▓реЗрдЦ рджреЗрдЦрд╛
- рдЗрдВрдЯреЗрд▓реАрдЬ рдЖрдИрдбреАрдИрдП рдореЗрдВ рдПрдХ рдПрдВрдбреНрд░реЙрдЗрдб-рдЖрдзрд╛рд░рд┐рдд рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдФрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдмрдирд╛рдирд╛ , рдореБрдЭреЗ рдПрд╣рд╕рд╛рд╕ рд╣реБрдЖ рдХрд┐ рдпрд╣ рдореЗрд░реА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдерд╛ред
рдПрдиреЛрдЯреЗрд╢рди рд▓рд╛рдЧреВ рдХрд░реЗрдВ
рдкрд░рдВрдкрд░рд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдПрдиреЛрдЯреЗрд╢рди рдХрд╛ рдЕрдзреНрдпрдпрди рд░реВрд╕реА рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдЬрд╛рдирдХрд╛рд░реА рдХреА рдХрдореА рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реБрдЖред рдЕрдзрд┐рдХрд╛рдВрд╢ рд▓реЗрдЦ рд░рдирдЯрд╛рдЗрдо рдПрдиреЛрдЯреЗрд╢рди рдХреЗ рдЙрдкрдпреЛрдЧ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╣реИрдмреЗ рдкрд░ рдПрдХ рдЙрдкрдпреБрдХреНрдд рд▓реЗрдЦ рдкрд╛рдпрд╛ рдЧрдпрд╛:
рдПрдиреЛрдЯреЗрд╢рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рд╡рд┐рдзрд┐ рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рд╕рдордп рдХреА рдЧрдгрдирд╛ ред
рд╕рдВрдХрд▓рди рд╕рдордп рдПрдиреЛрдЯреЗрд╢рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдЪрд╛рд╣рд┐рдП:
- рдПрдиреЛрдЯреЗрд╢рди рдХрд╛ рд╡рд░реНрдгрди рдХрд░реЗрдВ;
- AbstractProcessor рд╡рд░реНрдЧ рдХреЗ рд╡рдВрд╢рдЬ рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдВ, рдЬреЛ рд╣рдорд╛рд░реЗ рдПрдиреЛрдЯреЗрд╢рди рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд░реЗрдЧрд╛;
- рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ рдмрддрд╛рдПрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЛ рдХрд╣рд╛рдВ рджреЗрдЦрдирд╛ рд╣реИред
рдПрдХ рдПрдиреЛрдЯреЗрд╢рди рд╡рд┐рд╡рд░рдг рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗ рд╕рдХрддрд╛ рд╣реИ:
package com.example.annotation; @Target({ElementType.FIELD}) @Retention(RetentionPolicy.SOURCE) public @interface Hashed { String method() default "MD5"; }
рд▓рдХреНрд╖реНрдп - рдЙрди рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬрд┐рдирдХреЗ рд▓рд┐рдП рдПрдиреЛрдЯреЗрд╢рди рд▓рд╛рдЧреВ рд╣реИред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдПрдиреЛрдЯреЗрд╢рди рдХреЛ рдПрдХ рд╡рд░реНрдЧ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓ рдШреЛрд╖рдгрд╛рдУрдВ рдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдХрд┐рд╕реА рдХреЛ рднреА, рд▓реЗрдХрд┐рди рдЙрд╕ рдкрд░ рдмрд╛рдж рдореЗрдВред
рдкреНрд░рддрд┐рдзрд╛рд░рдг - рдПрдиреЛрдЯреЗрд╢рди рдЖрдЬреАрд╡рдиред рд╣рдо рд╕рдВрдХреЗрдд рджреЗрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ рд╕реНрд░реЛрдд рдХреЛрдб рдореЗрдВ рдореМрдЬреВрдж рд╣реИред
рдПрдиреЛрдЯреЗрд╢рди рдореЗрдВ, рд╣рдо рдПрдХ рдХреНрд╖реЗрддреНрд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рд╣реИрд╢рд┐рдВрдЧ рд╡рд┐рдзрд┐ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред рдбрд┐рдлрд╝реЙрд▓реНрдЯ MD5 рд╣реИред
рдпрд╣ рдХреЛрдб рдореЗрдВ рдПрдиреЛрдЯреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ, рд▓реЗрдХрд┐рди рдЬрдм рддрдХ рд╣рдо рдПрдиреЛрдЯреЗрд╢рди рд╣реИрдВрдбрд▓рд░ рдирд╣реАрдВ рд▓рд┐рдЦреЗрдВрдЧреЗ, рддрдм рддрдХ рдЗрд╕рдореЗрдВ рдХреЛрдИ рдЕрд░реНрде рдирд╣реАрдВ рд╣реЛрдЧрд╛ред
рдПрдХ рдПрдиреЛрдЯреЗрд╢рди рд╣реИрдВрдбрд▓рд░
javax.annotation.processing.AbstractProcessor рд╕реЗ рдЗрдирд╣реЗрд░рд┐рдЯ
рдХрд░рддрд╛ рд╣реИ ред рдиреНрдпреВрдирддрдо рд╣реИрдВрдбрд▓рд░ рд╡рд░реНрдЧ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
package com.example.annotation; @SupportedAnnotationTypes(value = {"com.example.annotation.Hashed"}) @SupportedSourceVersion(SourceVersion.RELEASE_7) public class HashedAnnotationProcessor extends AbstractProcessor { @Override public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) { return false; } }
SupportedAnnotationTypes - рдПрдиреЛрдЯреЗрд╢рди рд╡рд░реНрдЧреЛрдВ рдХреЗ рдирд╛рдореЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд╣рдорд╛рд░реЗ рдкреНрд░реЛрд╕реЗрд╕рд░ рджреНрд╡рд╛рд░рд╛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗред
SupportedSourceVersion - рд╕реНрд░реЛрдд рдХрд╛ рд╕рдорд░реНрдерд┐рдд рд╕рдВрд╕реНрдХрд░рдгред рдореБрджреНрджрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдкреНрд░реЛрд╕реЗрд╕рд░ рдПрдиреЛрдЯреЗрд╢рди рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддреЗ рд╕рдордп рднрд╛рд╖рд╛ рдХреЗ рдирдП рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрдиреЗ рд╡рд╛рд▓реЗ рднрд╛рд╖рд╛ рдирд┐рд░реНрдорд╛рдгреЛрдВ рдХреЛ рдирд╣реАрдВ рддреЛрдбрд╝рддрд╛ рд╣реИред
рдЗрди рдПрдиреЛрдЯреЗрд╢рди рдХреЗ рдмрдЬрд╛рдп, рдЖрдк
getSupportedAnnotationTypes рдФрд░
getSupportedSourcenotersion рддрд░реАрдХреЛрдВ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╡рд┐рдзрд┐ рдХреЛ рдХрдЪреНрдЪреЗ рд╕рдорд░реНрдерд┐рдд рдПрдиреЛрдЯреЗрд╢рди рдХреА рдПрдХ рд╕реВрдЪреА рдФрд░ рд╕рдВрдХрд▓рдХ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд╕реНрддреБ рдорд┐рд▓рддреА рд╣реИред рдпрджрд┐ рд╡рд┐рдзрд┐ рдЧрд▓рдд рдЖрддреА рд╣реИ, рддреЛ рд╕рдВрдХрд▓рдХ рдЕрдЧрд▓реЗ рдкреНрд░реЛрд╕реЗрд╕рд░ рдкрд░ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдПрдиреЛрдЯреЗрд╢рди рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдПрдиреЛрдЯреЗрд╢рди рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рд╡рд┐рдзрд┐ рдиреЗ рд╕рдЪреНрдЪрд╛рдИ рд▓реМрдЯрд╛ рджреА, рддреЛ рдПрдиреЛрдЯреЗрд╢рди рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдХрд╣реАрдВ рдФрд░ рдирд╣реАрдВ рдорд┐рд▓реЗрдЧрд╛ред рдпрд╣ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рддрд╛рдХрд┐ рдЧрд▓рддреА рд╕реЗ рдЕрдиреНрдп рд▓реЛрдЧреЛрдВ рдХреЗ рдПрдиреЛрдЯреЗрд╢рди рдХреЛ рдирд╛рдЦреВрди рди рджреЗрдВред
рдпрджрд┐ рдХрд┐рд╕реА рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рджреМрд░рд╛рди рд╕реНрд░реЛрдд рдХреЛрдб рдмрджрд▓ рдЧрдП рд╣реИрдВ рдпрд╛ рдЬреЛрдбрд╝реЗ рдЧрдП рд╣реИрдВ - рд╕рдВрдХрд▓рдХ рдЕрдЧрд▓реЗ рдкрд╛рд╕ рдкрд░ рдЬрд╛рдПрдЧрд╛ред
рд░рд╛рдЙрдВрдбрдПрдиреНрд╡рд╛рдпрд░рдореЗрдВрдЯ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рд╕реЛрд░реНрд╕ рдХреЛрдб рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдЗрд╕рд▓рд┐рдП рд╣рдо
рдЗрдирд┐рдЯ рд╡рд┐рдзрд┐ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░
рдЗрд╕рдореЗрдВ рд╕реЗ
JavacProcessingEnvironment рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рд╡рд░реНрдЧ рдЖрдкрдХреЛ рд╕реНрд░реЛрдд рдХреЛрдб, рдЪреЗрддрд╛рд╡рдиреА рдФрд░ рд╕рдВрдХрд▓рди рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдлреЗрдВрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рдгрд╛рд▓реА рдФрд░ рдмрд╣реБрдд рдХреБрдЫ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд╡рд╣рд╛рдБ рд╣рдореЗрдВ
рдЯреНрд░реАрдореЗрдХрд░ рдорд┐рд▓рддрд╛ рд╣реИ - рд╕реНрд░реЛрдд рдХреЛрдб рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╣рд╛рдпрдХ рдЙрдкрдХрд░рдгред
private JavacProcessingEnvironment javacProcessingEnv; private TreeMaker maker; @Override public void init(ProcessingEnvironment procEnv) { super.init(procEnv); this.javacProcessingEnv = (JavacProcessingEnvironment) procEnv; this.maker = TreeMaker.instance(javacProcessingEnv.getContext()); }
рдЕрдм рд╣рдореЗрдВ рдмрд╕ рдЕрдкрдиреЗ рдПрдиреЛрдЯреЗрдЯ рдХреНрд╖реЗрддреНрд░реЛрдВ рдкрд░ рдкреБрдирд░рд╛рд╡реГрддрд┐ рдХрд░рдирд╛ рд╣реИ рдФрд░ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдмрджрд▓рдирд╛ рд╣реИред рдореИрдВ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдХреЛрдб рджреЗрддрд╛ рд╣реВрдВред рд▓реЗрдЦ рдХреЗ рдЕрдВрдд рдореЗрдВ GitHub рд╕реЗ рд▓рд┐рдВрдХ рдХрд░реЗрдВред
@Override public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) { if ( annotations == null || annotations.isEmpty()) { return false; } for (TypeElement annotation : annotations) {
рд╡рд┐рдзрд┐ рдореЗрдВ, рд╣рдо рдПрдиреЛрдЯреЗрд╢рди рдХреА рд╕реВрдЪреА рд╕реЗ рдЧреБрдЬрд░рддреЗ рд╣реИрдВ (рдХреНрдпрд╛ рд╣рдореЗрдВ рдпрд╛рдж рд╣реИ рдХрд┐ рд╕рд╛рдорд╛рдиреНрдп рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдкреНрд░реЛрд╕реЗрд╕рд░ рдПрдиреЛрдЯреЗрд╢рди рд╕реЗ рдЕрдзрд┐рдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд░рддрд╛ рд╣реИ?), рдкреНрд░рддреНрдпреЗрдХ рдПрдиреЛрдЯреЗрд╢рди рдХреЗ рд▓рд┐рдП рд╣рдо рддрддреНрд╡реЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдХрд╛ рдЪрдпрди рдХрд░рддреЗ рд╣реИрдВред рдЙрд╕рдХреЗ рдмрд╛рдж, рдЬрд╛рджреВ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред рд╣рдо рддрддреНрд╡реЛрдВ рдХреЛ рд╕реНрд░реЛрдд рд╡реГрдХреНрд╖ рдореЗрдВ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП
com.sun.tools.javac рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рдЯреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╣реИрдВ рдФрд░, рдкрд░рдВрдкрд░рд╛ рд╕реЗ, рд░реВрд╕реА-рднрд╛рд╖рд╛ рдкреНрд░рд▓реЗрдЦрди рдХреА рдкреВрд░реНрдг рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ред рдЗрд╕рд▓рд┐рдП, рдХреГрдкрдпрд╛ рдЖрд╢реНрдЪрд░реНрдпрдЪрдХрд┐рдд рди рд╣реЛрдВ рдХрд┐ рдЗрд╕ рдкреЗрдбрд╝ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рдХреЛрдб рдЖрджрд░реНрд╢ рд╕реЗ рдмрд╣реБрдд рджреВрд░ рд╣реИред
рдЬрдм рд╣рдореЗрдВ
JCTree.JCVariableDecl var рдЯреНрд░реА рдХреЗ рд░реВрдк рдореЗрдВ рд╡реЗрд░рд┐рдПрдмрд▓ рдбрд┐рдХреНрд▓реЗрд░реЗрд╢рди рдорд┐рд▓рд╛ - рд╣рдо рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╡реЗрд░рд┐рдПрдмрд▓ рд╣реИред рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдЬрд╛рдБрдЪ рдмреИрд╕рд╛рдЦреА рдХреЗ рд╕рд╛рде рдХреА рдЧрдИ рд╣реИ:
if (!"String".equals(var.vartype.toString())){
vartype рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдлрд╝реАрд▓реНрдб рд╣реИ рдЬрд┐рд╕реЗ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдХреБрдЫ рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рд╡рд░реНрдЧ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ, рд▓реЗрдХрд┐рди, рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдХрд╣рд╛, рдХреЛрдИ рдкреНрд░рд▓реЗрдЦрди рдирд╣реАрдВ рд╣реИ, рдФрд░ рдПрдХ рддреНрд╡рд░рд┐рдд рдЬрд╛рдВрдЪ рд╕реЗ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдХрд╛рд╕реНрдЯрд┐рдВрдЧ рдХрд░рдиреЗ рд╕реЗ рд╣рдореЗрдВ рдЯрд╛рдЗрдк рдирд╛рдо рдорд┐рд▓рддрд╛ рд╣реИред
рджреВрд╕рд░рд╛ рджрд┐рд▓рдЪрд╕реНрдк рдмрд┐рдВрджреБ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рдХреЗрд╡рд▓ рд▓реЗрдЦ рдХреА рд╢реБрд░реБрдЖрдд рд╕реЗ рд╣реА рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рдорд╛рди рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕ рд╕реНрддрд░ рдкрд░ рд╣рдо рд╕реНрд░реЛрдд рдкрд╛рда рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рд╡реИрд░рд┐рдПрдмрд▓ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ
JCTree.JCExpression initializer = var.getInitializer (); рд╣рдореЗрдВ
рдЕрд╢рдХреНрдд рдХрд░ рджреЗрдЧрд╛ ред рдпрджрд┐ рд╣рдо рдкреНрд░рдкрддреНрд░ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рд╕рдорд╛рди рд░реВрдк рд╕реЗ рдЕрдкреНрд░рд┐рдп рд╕реНрдерд┐рддрд┐ рдирд┐рдХрд▓ рдЬрд╛рдПрдЧреА:
public String demo1 = new String("habrahabr"); public String demo2 = "habra"+"habr"; public String demo3 = "" + 1;
рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рджреВрд╕рд░рд╛ рдЪреЗрдХ рдкреЗрд╢ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ
(рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝рд░ рдЗрдВрд╕реНрдЯреЙрдлрд╝рдЯ JCTree.JCLiteral) ред рдпрд╣ рд╕рднреА рд╡рд░реНрдгрд┐рдд рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рдХрд╛рдЯ рджреЗрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдЕрдкрдиреЗ рд╢реБрджреНрдз рд░реВрдк рдореЗрдВ рд╢рд╛рдмреНрджрд┐рдХ рдирд╣реАрдВ рд╣реИрдВ рдФрд░ рдкреЗрдбрд╝ рдореЗрдВ рдХрдИ рддрддреНрд╡реЛрдВ рдХреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдЖрдЧреЗ рдХреЛрдб рд╕реНрдкрд╖реНрдЯ рд╣реИред рд╣рдо рдПрдХ рд▓рд╛рдЗрди рд▓реЗрддреЗ рд╣реИрдВ, рд╣реИрд╢, рд░рд┐рдкреНрд▓реЗрд╕, рдЖрдирдиреНрдж? рдирд╣реАрдВред
рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рдХрдИ рд╕реНрдерд╛рдиреЛрдВ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддреА рд╣реИрдВ рдЬрд╣рд╛рдВ рд╕реНрдкрд╖реНрдЯ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╣реЛрддреА рд╣реИрдВред рдФрд░ рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЙрдиреНрд╣реЗрдВ рдЕрдирджреЗрдЦрд╛ рдХрд░рдирд╛ рд╕рд╣реА рд╡реНрдпрд╡рд╣рд╛рд░ рдирд╣реАрдВ рд╣реИред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рддреНрд░реБрдЯрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реВрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ
javax.annotation.processing.Messager рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣ рдЖрдкрдХреЛ рдПрдХ рдЪреЗрддрд╛рд╡рдиреА, рдПрдХ рд╕рдВрдХрд▓рди рддреНрд░реБрдЯрд┐, рдпрд╛ рд╕рд┐рд░реНрдл рдПрдХ рд╕реВрдЪрдирд╛ рд╕рдВрджреЗрд╢ рдлреЗрдВрдХрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рдЕрдорд╛рдиреНрдп рд╣реИрд╢ рдПрд▓реНрдЧреЛрд░рд┐рдердо рдХреА рд░рд┐рдкреЛрд░реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
catch (NoSuchAlgorithmException e) { javacProcessingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, String.format("Unsupported digest method %s", hashed.method()), field); }
рдпрд╣ рд╕рдордЭрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдлреЗрдВрдХрдиреЗ рд╕реЗ рд╡рд┐рдзрд┐ рдХрд╛ рдирд┐рд╖реНрдкрд╛рджрди рдмрд╛рдзрд┐рдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рд╕рдВрдХрд▓рди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдмрд╛рдзрд┐рдд рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╕рдВрдХрд▓рдХ рдХрдо рд╕реЗ рдХрдо рд╣рдорд╛рд░реА рдкрджреНрдзрддрд┐ рдХреЗ рдЕрдВрдд рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░реЗрдЧрд╛ред рдпрд╣ рдЖрдкрдХреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдПрдиреЛрдЯреЗрд╢рди рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рд╕рднреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рддреБрд░рдВрдд рджреВрд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
PrintMessage рдкрджреНрдзрддрд┐ рдХрд╛ рддреАрд╕рд░рд╛ рддрд░реНрдХ рд╣рдореЗрдВ рдЙрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬрд┐рд╕ рдкрд░ рд╣рдордиреЗ рдареЛрдХрд░ рдЦрд╛рдИ рдереАред рдпрд╣ рдЕрдирд┐рд╡рд╛рд░реНрдп рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЬреАрд╡рди рдХреЛ рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдмрдирд╛рддрд╛ рд╣реИред
рдХрдиреЗрдХреНрдЯ рдПрдиреЛрдЯреЗрд╢рди рдкреНрд░реЛрд╕реЗрд╕рд░
рдпрд╣ рд╕рдВрдХрд▓рдХ рдХреЛ рдмрддрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд╣реБрдЖ рд╣реИ рдХрд┐ рд╣рдо рдлрд╛рдбрд╝ рдХреЗ рд▓рд┐рдП рдПрдиреЛрдЯреЗрд╢рди рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИрдВред рдХрдИ рд▓реЗрдЦ рдирд┐рд░реНрджреЗрд╢ рдХреЗ рд╕рд╛рде рдЖрддреЗ рд╣реИрдВ рдХрд┐ рдЕрдкрдиреЗ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЛ <рд╡рд┐рдХрд╛рд╕ рдкрд░реНрдпрд╛рд╡рд░рдг рдирд╛рдо> рд╕реЗ рдХреИрд╕реЗ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдПред рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдпрд╣ рдкреНрд░рд╛рдЪреАрди рдХрд╛рд▓ рдореЗрдВ рд╡рд╛рдкрд╕ рдЬрд╛рддрд╛ рд╣реИ, рдЬрдм рдХрд╛рд░реАрдЧрд░реЛрдВ рджреНрд╡рд╛рд░рд╛ рдШреБрдЯрдиреЛрдВ рдкрд░ рдРрд╕реА рдЪреАрдЬреЗрдВ рдХреА рдЬрд╛рддреА рдереАрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдХрд╛рдлреА рд╕рдордп рдкрд╣рд▓реЗ, рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдПрдиреЛрдЯреЗрд╢рди рдХрд╛ рддрдВрддреНрд░ javac рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд░рд╣рд╛ рд╣реИ рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╣рдорд╛рд░реЗ рд╡рд░реНрдЧ рд╣реИрдВрдбрд▓рд░ javac рдХреЗ рд▓рд┐рдП рдкреНрд▓рдЧ-рдЗрди рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рдЕрдкрдиреЗ рдПрдиреЛрдЯреЗрд╢рди рдХреЛ рдмрд┐рдирд╛ рдорд╛рдирдХрддрд╛ рдХреЗ рд╕рд╛рде рдХрд┐рд╕реА рднреА рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдХрдиреЗрдХреНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рд╣рдореЗрдВ
рдореЗрдЯрд╛- рдЗрди рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ
рд╕реЗрд╡рд╛рдУрдВ рдХреА рдПрдХ рдЙрдкрдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдФрд░ рдЗрд╕рдореЗрдВ
javax.annotation.processing.Processor рдлрд╝рд╛рдЗрд▓ред рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╣реА, рд╣рдореЗрдВ рдЕрдкрдиреЗ рдкреНрд░реЛрд╕реЗрд╕рд░ рд╡рд░реНрдЧреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдбрд╛рд▓рдиреА рд╣реЛрдЧреАред рд╡рд┐рд╢рд┐рд╖реНрдЯ рдорд╛рдорд▓реЗ рдореЗрдВ,
com.example.annotation.HashedAnnotationProcessor ред рдФрд░ рд╡рд╣ рдпрд╣ рд╣реИред рдЕрдм рд╣рдо рдЕрдкрдиреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рдПрдиреЛрдЯреЗрд╢рди рдФрд░ рдЙрд╕рдХрд╛ рдкреНрд░реЛрд╕реЗрд╕рд░ рд╣реИред рд╣рдо рдЗрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реЗ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред рдФрд░ рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
рдЙрд╕реА рд╕рдордп, рди рддреЛ рдкреБрд╕реНрддрдХрд╛рд▓рдп, рдФрд░ рди рд╣реА рдПрдиреЛрдЯреЗрд╢рди рдХреЗ рдЕрд╡рд╢реЗрд╖ рд╕рдВрдХрд▓рд┐рдд рдХреЛрдб рдореЗрдВ рдЧрд┐рд░ рдЬрд╛рдПрдВрдЧреЗред
рдХреЗ рдЙрдкрдпреЛрдЧ
рд╕рд╛рд░ рддреИрдпрд╛рд░ рд╣реИред рддрд╛рд░ рдХрд╛рдЯреЗ рдЧрдП рд╣реИрдВред рдпрд╣ рд╕рд┐рд░реНрдл рд╕рдорд╕реНрдпрд╛ рдЕрднреА рднреА рд╣рд▓ рдирд╣реАрдВ рд╣реИред
рдпрджрд┐ рд╣рдо рдПрдиреЛрдЯреЗрд╢рди рдХреЛ рдЗрд╕ рд░реВрдк рдореЗрдВ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реЗ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рддреЛ рд╣рдорд╛рд░реА рд▓рд╛рдЗрдиреЗрдВ рд╣рдореЗрд╢рд╛ рд╣реИрд╢реЗрдб рд╣реЛрдВрдЧреАред рдФрд░ рд╣рдореЗрдВ рдХреЗрд╡рд▓ рд░рд┐рд▓реАрдЬрд╝ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдЬрд╛рд╡рд╛ рдореЗрдВ, рдбрд┐рдмрдЧрд┐рдВрдЧ рдФрд░ рд░рд┐рд▓реАрдЬрд╝ рдмрд┐рд▓реНрдб рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдмрд╣реБрдд рдордирдорд╛рдиреА рд╣реИ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд╡рд┐рдЪрд╛рд░реЛрдВ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреА рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдПрдВрдбреНрд░реЙрдЗрдб рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП
рдЕрд╕реЗрдВрдмрдбреЗрдмрдЧ рдХрд╛рд░реНрдп рдореЗрдВ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╣реИрд╢ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдЕрдиреНрдп рд╕рднреА рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдПрдордбреА 5 рд╣реИрд╢ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рд╕реЗ рд░рд╣рддрд╛ рд╣реИред
рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЕрдкрдиреЗ рдПрдиреЛрдЯреЗрд╢рди рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдкреИрд░рд╛рдореАрдЯрд░ рдкрд╛рд╕ рдХрд░реЗрдВрдЧреЗред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░реЗрдВ:
@SupportedOptions({"Hashed"}) public class HashedAnnotationProcessor extends AbstractProcessor { private boolean enable = true; @Override public void init(ProcessingEnvironment procEnv) {
рд╣рдордиреЗ рдШреЛрд╖рдгрд╛ рдХреА рдХрд┐ рд╣рдо "рд╣рд╢реЗрдб" рд╡рд┐рдХрд▓реНрдк рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рдпрджрд┐ рдпрд╣ "рдЕрдХреНрд╖рдо" рд╣реИ, рддреЛ рд╣рдо рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВред Diagnostic.Kind.NOTE рдЬреИрд╕реЗ рд╕рдВрджреЗрд╢ рд╕реВрдЪрдирд╛рддреНрдордХ рд╣реИрдВ рдФрд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдкрд░ рд╣реИрдВ, рдХрдИ рд╡рд┐рдХрд╛рд╕ рд╡рд╛рддрд╛рд╡рд░рдг рдЗрди рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАрдВ рджрд┐рдЦрд╛рдПрдВрдЧреЗред
рдЙрд╕реА рд╕рдордп, рд╣рдо рд╕рдВрдХрд▓рдХ рдХреЛ рд╕реВрдЪрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЙрдиреНрд╣реЛрдВрдиреЗ рдПрдиреЛрдЯреЗрд╢рди рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╢реБрд░реВ рдирд╣реАрдВ рдХреА рдереАред рдпрджрд┐ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдЕрднреА рднреА рдкреНрд░реЛрд╕реЗрд╕рд░ рд╣реИрдВ рдЬреЛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдПрдиреЛрдЯреЗрд╢рди рдХреЛ рдкреНрд░реЛрд╕реЗрд╕ рдХрд░рддреЗ рд╣реИрдВ, рдпрд╛ рдЯрд╛рдЗрдк рдХреЛ рдкрд╛рд░реНрд╕ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╡реЗ рд╣рдорд╛рд░рд╛ рдПрдиреЛрдЯреЗрд╢рди рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рд╕рдЪ рд╣реИ, рдореИрдВ рдЙрд╕ рдЖрджреЗрд╢ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд┐рд▓реНрдХреБрд▓ рдХреБрдЫ рдирд╣реАрдВ рдХрд╣ рд╕рдХрддрд╛ рдЬрд┐рд╕рдореЗрдВ рд╕рдВрдХрд▓рдХ рдПрдиреЛрдЯреЗрд╢рди рдХреЛ рдирд┐рдкрдЯрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдЧрд╛ред рдЕрдм рддрдХ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреЗрд╡рд▓ рд╣рдорд╛рд░реА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╣реИ рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдПрдиреЛрдЯреЗрд╢рди рд╣реИ - рдпрд╣ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдк рдПрдиреЛрдЯреЗрд╢рди рдХреЗ рдХрдИ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╕рд░рдлреЗрд╕рд┐рдВрдЧ рдиреБрдХрд╕рд╛рди рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд░рд╣реЗрдВред
рдпрд╣ рдЗрд╕ рд╡рд┐рдХрд▓реНрдк рдХреЛ рд╕рдВрдХрд▓рдХ рдХреЛ рдкрд╛рд╕ рдХрд░рдирд╛ рдмрд╛рдХреА рд╣реИред рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рд▓рд┐рдП рд╡рд┐рдХрд▓реНрдк рдП-рд╕реНрд╡рд┐рдЪ рдХреЗ рд╕рд╛рде рд╕рдВрдХрд▓рдХ рдХреЛ рджрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, "-рд╣реЗрдбреЗрдб = рдЕрдХреНрд╖рдо"ред
рдпрд╣ рд╕рдм рдХреБрдЫ рд╕рд╣реА рд╕рдордп рдкрд░ рдЧреНрд░реЗрдбрд▓ рдХреЛ рдЗрд╕ рд╡рд┐рдХрд▓реНрдк рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИред рдФрд░ рдмреИрд╕рд╛рдЦреА рдлрд┐рд░ рд╕реЗ:
tasks.withType(JavaCompile) { if (name == "compileDebug"){ options.compilerArgs << "-AHashed=disable" } }
рдпрд╣ рдПрдВрдбреНрд░реЙрдЗрдб рд╕реНрдЯреВрдбрд┐рдпреЛ рдХреЗ рд╡рд░реНрддрдорд╛рди рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рд╣реИред рдкрд╣рд▓реЗ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдПред рдЯрд╛рдЗрдк (рд╕рдВрдХрд▓рди)ред
рдХреНрд░рдЪ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдмреНрд▓реЙрдХ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХрд╛рд░ рдХреА рдЕрд╕реЗрдВрдмрд▓реА рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХрд╛рд░реНрдп рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛ред рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдПрдВрдбреНрд░реЙрдЗрдб рдмреНрд▓реЙрдХ рд╕реЗ рдмрд┐рд▓реНрдбрдЯрд╛рдЗрдкреНрд╕ рдХреЗ рд╕рдорд╛рди рдХреБрдЫ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдореЗрд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рд╕реБрдВрджрд░ рд╕рдорд╛рдзрд╛рди рджреЗрдЦрдиреЗ рдХреА рддрд╛рдХрдд рдирд╣реАрдВ рдереАред рдЖрдЦрд┐рд░рдХрд╛рд░, рд╕рднреА рдиреЗ рдкрд╣рд▓реЗ рд╣реА рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдпрд╛ рд╣реИ рдХрд┐ рдкрд░рдВрдкрд░рд╛рдЧрдд рд░реВрдк рд╕реЗ рд░реВрд╕реА рдореЗрдВ рдХреЛрдИ рджрд╕реНрддрд╛рд╡реЗрдЬ рдирд╣реАрдВ рд╣реИ?
рдХреЛрдб рдореЗрдВ, рдПрдиреЛрдЯреЗрд╢рди рдЗрд╕ рддрд░рд╣ рджрд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:
@Hashed public static final String demo1 = "habr"; @Hashed (method="SHA-1") public static final String demo2 = "habrahabr"; @Hashed(method="SHA-256") public static final String demo3 = "habracadabra";
рд╡рд┐рдзрд┐ рд╕рдорд░реНрдерд┐рдд
MessageDigest рдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рд╣реЛ рд╕рдХрддреА рд╣реИред
рдкрд░рд┐рдгрд╛рдо
рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рд╣реЛ рдЧрдИ рд╣реИред рдмреЗрд╢рдХ, рдХреЗрд╡рд▓ рд╕реНрдерд┐рд░рд╛рдВрдХ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рдПрдХ рдмрд╣реБрдд рд╣реА рд╡рд┐рд╢рд┐рд╖реНрдЯ рддрд░реАрдХреЗ рдХреЗ рд▓рд┐рдП, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рд╕рдмрд╕реЗ рдХреБрд╢рд▓ рддрд░реАрдХреЗ рд╕реЗ рдирд╣реАрдВ, рдФрд░ рдХрдИ рд╕рдорд╕реНрдпрд╛ рдХрдерди рдХреЗ рд▓рд┐рдП рд╕реНрд╡рдпрдВ рд▓реЗрдЦ рдХреА рд╕рд╛рдордЧреНрд░реА рд╕реЗ рдЕрдзрд┐рдХ рдкреНрд░рд╢реНрди рдЙрдард╛рдПрдВрдЧреЗред рдФрд░ рдореИрдВ рд╕рд┐рд░реНрдл рдпрд╣ рдЙрдореНрдореАрдж рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдЕрдЧрд░ рдХреЛрдИ рд╕рдорд╛рди рдХрд╛рд░реНрдп рдЙрд╕рдХреЗ рд░рд╛рд╕реНрддреЗ рдореЗрдВ рдорд┐рд▓рддрд╛ рд╣реИ, рддреЛ рд╡рд╣ рдХрдо рд╕рдордп рдФрд░ рдирд╕реЛрдВ рдХреЛ рдЦрд░реНрдЪ рдХрд░реЗрдЧрд╛ред
рд▓реЗрдХрд┐рди рдЗрд╕рд╕реЗ рднреА рдЕрдзрд┐рдХ рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдХрд┐рд╕реА рдХреЛ рдЗрд╕ рд╡рд┐рд╖рдп рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реЛрдЧреА рдФрд░ рд╣реИрдмрд░ рдЙрди рд▓реЗрдЦреЛрдВ рдХреЛ рджреЗрдЦреЗрдВрдЧреЗ рдЬреЛ рдмрддрд╛рдПрдВрдЧреЗ рдХрд┐ рдпрд╣ рд╕рдм рдЬрд╛рджреВ рдХреНрдпреЛрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
рдФрд░, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рд╡рд╛рджрд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдХреЛрдб:
GitHub :: DemoAnnotation