
рд╣рдо рд╕рднреА рд░рдирдЯрд╛рдЗрдо рдЕрдкрд╡рд╛рджреЛрдВ рдХреЗ рдмрдЬрд╛рдп рд╕рдВрдХрд▓рди рдЪрд░рдг рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдкрдХрдбрд╝рдирд╛ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВред рдЙрдиреНрд╣реЗрдВ рдареАрдХ рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдХрдВрдкрд╛рдЗрд▓рд░ рдЙрди рд╕рднреА рд╕реНрдерд╛рдиреЛрдВ рдХреЛ рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рдареАрдХ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдпрджреНрдпрдкрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рдХреЗрд╡рд▓ рддрднреА рдкрддрд╛ рд▓рдЧрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрдм рдХрд╛рд░реНрдпрдХреНрд░рдо рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рд╣рдо рдЕрднреА рднреА рдЗрд╕реЗ рдЬрд▓реНрдж рд╕реЗ рдЬрд▓реНрдж рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВред
рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рдЖрд░рдВрднреАрдХрд░рдг рдХреЗ рдмреНрд▓реЙрдХ рдореЗрдВ, рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛рдУрдВ рдореЗрдВ, рдПрдХ рд╡рд┐рдзрд┐ рдХреЗ рдкрд╣рд▓реЗ рдХреЙрд▓ рдкрд░, рдЖрджрд┐ред рдФрд░ рдХрднреА-рдХрднреА рд╣рдо рднрд╛рдЧреНрдпрд╢рд╛рд▓реА рд╣реЛрддреЗ рд╣реИрдВ, рдФрд░ рд╕рдВрдХрд▓рди рдЪрд░рдг рдкрд░ рднреА рд╣рдо рдХреБрдЫ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдЬрд╛рдирддреЗ рд╣реИрдВред
рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдПрдХ рдРрд╕реА рдкрд░реАрдХреНрд╖рд╛ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдЕрдиреБрднрд╡ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ, рдПрдХ рдПрдиреЛрдЯреЗрд╢рди рдмрдирд╛рдирд╛ рдЬреЛ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдлреЗрдВрдХ рд╕рдХрддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рд╕рдВрдХрд▓рдХ рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рддрдереНрдп рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ RuNet рдореЗрдВ рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдЗрддрдиреА рдЬрд╛рдирдХрд╛рд░реА рдирд╣реАрдВ рд╣реИ, рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рд╕реБрдЦрдж рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпрд╛рдВ рдЕрдХреНрд╕рд░ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИрдВред
рдореИрдВ рд╕рд╛рдорд╛рдиреНрдп рд╕рддреНрдпрд╛рдкрди рдПрд▓реНрдЧреЛрд░рд┐рджрдо, рд╕рд╛рде рд╣реА рд╕рд╛рде рд╕рднреА рдЪрд░рдгреЛрдВ рдФрд░ рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реВрдВрдЧрд╛ рдЬрд┐рдирдХреЗ рд▓рд┐рдП рдореИрдВрдиреЗ рд╕рдордп рдФрд░ рддрдВрддреНрд░рд┐рдХрд╛ рдХреЛрд╢рд┐рдХрд╛рдПрдВ рдмрд┐рддрд╛рдИ рдереАрдВред
рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдмрдпрд╛рди
рдЗрд╕ рдЦрдВрдб рдореЗрдВ, рдореИрдВ рдЗрд╕ рдПрдиреЛрдЯреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреВрдВрдЧрд╛ред рдпрджрд┐ рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк рдХреНрдпрд╛ рдЪреЗрдХ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЗрд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдЫреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдпрд╣ рдкреНрд░рд╕реНрддреБрддрд┐ рдХреА рдкреВрд░реНрдгрддрд╛ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред
рдЕрдм рд╣рдо рдХреАрдбрд╝реЗ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХреЛрдб рдХреА рдкрдардиреАрдпрддрд╛ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗред рдПрдХ рдЙрджрд╛рд╣рд░рдг, рдХреЛрдИ рдХрд╣ рд╕рдХрддрд╛ рд╣реИ, рдЬреАрд╡рди рд╕реЗ, рдпрд╛ рдореЗрд░реЗ рд╢реМрдХ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реЗред
рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдПрдХ UnitManager рд╡рд░реНрдЧ рд╣реИ, рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЗрдХрд╛рдЗрдпреЛрдВ рдХрд╛ рдПрдХ рд╕рдВрдЧреНрд░рд╣ рд╣реИред рдЗрд╕рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ, рд╣рдЯрд╛рдиреЗ, рдПрдХ рдЗрдХрд╛рдИ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдЖрджрд┐ рдХреА рд╡рд┐рдзрд┐рдпрд╛рдБ рд╣реИрдВред рдПрдХ рдирдИ рдЗрдХрд╛рдИ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдкрд░, рдкреНрд░рдмрдВрдзрдХ рдЗрд╕реЗ рдПрдХ рдЖрдИрдбреА рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдЖрдИрдбреА рдХреА рдкреАрдврд╝реА рдХреЛ рд░реЛрдЯреЗрдЯрдХрд╛рдЙрдВрдЯрд░ рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП рд╕реМрдВрдк рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬреЛ рджрд┐рдП рдЧрдП рд░реЗрдВрдЬ рдореЗрдВ рдПрдХ рдирдВрдмрд░ рджреЗрддрд╛ рд╣реИред рдФрд░ рдПрдХ рдЫреЛрдЯреА рд╕реА рд╕рдорд╕реНрдпрд╛ рд╣реИ, рд░реЛрдЯреЗрдЯрдХрд╛рдЙрдВрдЯрд░ рдпрд╣ рдирд╣реАрдВ рдЬрд╛рди рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЪрдпрдирд┐рдд рдЖрдИрдбреА рдореБрдлреНрдд рд╣реИ рдпрд╛ рдирд╣реАрдВред рдирд┐рд░реНрднрд░рддрд╛ рдЙрд▓рдЯрд╛ рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдЖрдк рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ RotateCounter.IClient рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдПрдХрд▓ рд╡рд┐рдзрд┐ рд╣реИValueFree (), рдЬреЛ рдЖрдИрдбреА рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЖрдИрдбреА рдХреЗ рдореБрдХреНрдд рд╣реЛрдиреЗ рдкрд░ рд╡рд╛рдкрд╕ рд▓реМрдЯрддрд╛ рд╣реИред рдФрд░ UnitManager рдЗрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, RotateCounter рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдПрдХ рдЧреНрд░рд╛рд╣рдХ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрд╡рдпрдВ рдХреЛ рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реИред
рдореИрдВрдиреЗ рдмрд╕ рдЗрддрдирд╛ рд╣реА рдХрд┐рдпрд╛ред рд▓реЗрдХрд┐рди, рд▓рд┐рдЦрдиреЗ рдХреЗ рдХреБрдЫ рджрд┐рдиреЛрдВ рдмрд╛рдж рдпреВрдирд┐рдЯ рдореИрдирдЬрд░ рдХреЗ рд╕реНрд░реЛрдд рдХреЛ рдЦреЛрд▓ рджрд┐рдпрд╛ рдЧрдпрд╛, рдореИрдВ рдЗрд╕рд╡реЗрд▓рдлреНрд░реА () рдкрджреНрдзрддрд┐ рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рдмрд╛рдж рдПрдХ рдЖрд╕рд╛рди рд╕реНрддреВрдк рдореЗрдВ рдЪрд▓рд╛ рдЧрдпрд╛, рдЬрд┐рд╕рдиреЗ рдпреВрдирд┐рдЯрдореИрди рдХреЗ рддрд░реНрдХ рдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдлрд┐рдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ред рдпрд╣ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реЛрдЧрд╛ рдпрджрд┐ рдпрд╣ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рд╕рдВрднрд╡ рдерд╛ рдХрд┐ рдХреМрди рд╕рд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕реА # рдореЗрдВ, рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рдореИрдВ рдЬрд╛рд╡рд╛ рдореЗрдВ рдЖрдпрд╛ рдерд╛, рдПрдХ рд╕реНрдкрд╖реНрдЯ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрдк рдХреЗрд╡рд▓ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдкрд╖реНрдЯ рдХрд▓рд╛рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рджреВрд╕рд░реЗ, рдФрд░ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд, рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдирд╛рдо (рдФрд░ рдПрдХреНрд╕реЗрд╕ рд╕рдВрд╢реЛрдзрдХ рдХреЗ рдмрд┐рдирд╛) рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╡рд┐рдзрд┐ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдореЗрдВ рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
IClient.isValueFree(int value) { }
рдПрдХ рд╕рдорд╛рдзрд╛рди рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдирд╛рдо рдХреЗ рд╕рд╛рде рдПрдХ рдПрдиреЛрдЯреЗрд╢рди рдЬреЛрдбрд╝ рд░рд╣рд╛ рд╣реИред
@Override
рдЬреИрд╕рд╛ рдХреБрдЫ, рдХреЗрд╡рд▓ рдПрдХ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд╕рд╛рдеред рдореИрдВ рд╕рд╣рдордд рд╣реВрдВ, рдЖрдк рдПрдХ рдЕрдирд╛рдо рдЖрдВрддрд░рд┐рдХ рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, C # рдХреА рддрд░рд╣, рд╡рд┐рдзрд┐ рдХреЛ рдХреЗрд╡рд▓ рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд░ рдирд╣реАрдВ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдЖрдк рддреБрд░рдВрдд рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХрд┐рд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди, рдЗрд╕рд╕реЗ рдХреЛрдб рдХреА рдорд╛рддреНрд░рд╛ рдореЗрдВ рд╡реГрджреНрдзрд┐ рд╣реЛрдЧреА, рдЗрд╕рд▓рд┐рдП, рдкрдардиреАрдпрддрд╛ рдХреЛ рдиреАрдЪрд╛ рджрд┐рдЦрд╛рдирд╛ред рд╣рд╛рдВ, рдФрд░ рдЖрдкрдХреЛ рдЗрд╕реЗ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдХрдХреНрд╖рд╛ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ - рдПрдХ рдЧреЗрдЯрд░ рдпрд╛ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдХреНрд╖реЗрддреНрд░ рдмрдирд╛рдПрдВ (рдЖрдЦрд┐рд░рдХрд╛рд░, рдЬрд╛рд╡рд╛ рдореЗрдВ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдУрд╡рд░рд▓реЛрдб рдирд╣реАрдВ рд╣реИ)ред рдПрдХ рдмреБрд░рд╛ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрд╣ рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдерд╛ рдХрд┐ рдЬрд╛рд╡рд╛ рдореЗрдВ, рд╕реА # рдореЗрдВ, рдПрдиреЛрдЯреЗрд╢рди рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрдХреНрд╖рд╛рдПрдВ рд╣реИрдВ рдФрд░ рдЙрдирд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдкрдХреЛ рдмрд╕ рдПрдХ рдПрдиреЛрдЯреЗрд╢рди рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ @Override рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИред рд▓реЗрдХрд┐рди рдРрд╕рд╛ рдирд╣реАрдВ рдерд╛, рдФрд░ рдореБрдЭреЗ рд╕рдВрдХрд▓рди рдХреЗ рдЪрд░рдг рдореЗрдВ рдЪреЗрдХ рдХреА рдЕрджреНрднреБрдд рдФрд░ рднрдпрд╛рд╡рд╣ рджреБрдирд┐рдпрд╛ рдореЗрдВ рдЙрддрд░рдирд╛ рдкрдбрд╝рд╛ред
UnitManager рдирдореВрдирд╛ рдХреЛрдб public class Unit { private int id; } public class UnitManager implements RotateCounter.IClient { private final Unit[] units; private final RotateCounter idGenerator; public UnitManager(int size) { units = new Unit[size]; idGenerator = new RotateCounter(0, size, this); } public void addUnit(Unit unit) { int id = idGenerator.findFree(); units[id] = unit; } @Implement(RotateCounter.IClient.class) public boolean isValueFree(int value) { return units[value] == null; } public void removeUnit(int id) { units[id] = null; } } public class RotateCounter { private final IClient client; private int next; private int minValue; private int maxValue; public RotateCounter(int minValue, int maxValue, IClient client) { this.client = client; this.minValue = minValue; this.maxValue = maxValue; next = minValue; } public int incrementAndGet() { int current = next; if (next >= maxValue) { next = minValue; return current; } next++; return current; } public int range() { return maxValue - minValue + 1; } public int findFree() { int range = range(); int trysCounter = 0; int id; do { if (++trysCounter > range) { throw new IllegalStateException("No free values."); } id = incrementAndGet(); } while (!client.isValueFree(id)); return id; } public static interface IClient { boolean isValueFree(int value); } }
рд╕рд┐рджреНрдзрд╛рдВрдд рдХреА рдмрд┐рдЯ
рдореИрдВ рддреБрд░рдВрдд рдПрдХ рдЖрд░рдХреНрд╖рдг рдХрд░реВрдБрдЧрд╛, рдЙрдкрд░реЛрдХреНрдд рд╕рднреА рд╡рд┐рдзрд┐рдпрд╛рдБ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП, рд╕рдВрдХреНрд╖рд┐рдкреНрддрддрд╛ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдкреНрд░рдХрд╛рд░ рдХреЗ рдирд╛рдо рдХреЗ рд╕рд╛рде рдФрд░ рдмрд┐рдирд╛ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рддрд░реАрдХреЛрдВ рдХреЗ рдирд╛рдореЛрдВ рдХреЛ рдЗрдВрдЧрд┐рдд
<_>.<_>()
:
<_>.<_>()
ред
рд╕рдВрдХрд▓рди рдЪрд░рдг рдкрд░ рддрддреНрд╡реЛрдВ рдХреЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рд╡рд┐рд╢реЗрд╖ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХрдХреНрд╖рд╛рдПрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдпреЗ рдРрд╕реА рдХрдХреНрд╖рд╛рдПрдВ рд╣реИрдВ рдЬреЛ
javax.annotation.processing.AbstractProcessor
(рдЖрдк рдмрд╕
javax.annotation.processing.Processor
рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ) рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред рдЖрдк
рдпрд╣рд╛рдВ рдФрд░
рдпрд╣рд╛рдВ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рдореЗрдВ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡рд┐рдзрд┐ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╣реИред рдЬрд┐рд╕рдореЗрдВ рд╣рдо рд╕рднреА рдПрдиреЛрдЯреЗрдЯ рддрддреНрд╡реЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЖрд╡рд╢реНрдпрдХ рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
@Override public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment env) { return false; }
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ рднреЛрд▓рд╛, рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдХрд┐ рд╕рдВрдХрд▓рди рдХреЗ рд╕реНрддрд░ рдкрд░ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди ... рдирд╣реАрдВред рд╕рдм рдХреБрдЫ рд╡рд╣рд╛рдВ рдХреЗ рддрддреНрд╡реЛрдВ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИред
рддрддреНрд╡ (
javax.lang.model.element.Element ) - рднрд╛рд╖рд╛ рдХреЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рддрддреНрд╡реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореБрдЦреНрдп рдЗрдВрдЯрд░рдлрд╝реЗрд╕ред рдПрдХ рддрддреНрд╡ рдХреЗ рд╡рдВрд╢рдЬ рд╣реИрдВ рдЬреЛ рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рддрддреНрд╡ рдХреЗ рдЧреБрдгреЛрдВ рдХреЛ рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ (рд╡рд┐рд╡рд░рдг рдХреЗ рд▓рд┐рдП,
рдпрд╣рд╛рдВ рджреЗрдЦреЗрдВ):
package ds.magic.example.implement;
TypeMirror (
javax.lang.model.type.TypeMirror ) рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╣реИ рдХреНрд▓рд╛рд╕ <?>
GetClass () рд╡рд┐рдзрд┐ рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЙрдирдХреА рддреБрд▓рдирд╛ рдпрд╣ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ рдХрд┐ рддрддреНрд╡реЛрдВ рдХреЗ рдкреНрд░рдХрд╛рд░ рдореЗрд▓ рдЦрд╛рддреЗ рд╣реИрдВ рдпрд╛ рдирд╣реАрдВред рдЖрдк
Element.asType()
рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдкреНрд░рдХрд╛рд░ рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЛ рднреА рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдЬреИрд╕реЗ
TypeElement.getSuperclass()
рдпрд╛
TypeElement.getInterfaces()
ред
рдкреНрд░рдХрд╛рд░ (
javax.lang.model.util.Types ) - рдореИрдВ рдЖрдкрдХреЛ рдЗрд╕ рд╡рд░реНрдЧ рдкрд░ рдХрд░реАрдм рд╕реЗ рдирдЬрд╝рд░ рдбрд╛рд▓рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдБред рдЖрдк рд╡рд╣рд╛рдВ рдмрд╣реБрдд рд╕рд╛рд░реА рджрд┐рд▓рдЪрд╕реНрдк рдЪреАрдЬреЗрдВ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдпрд╣ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧрд┐рддрд╛рдУрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЖрдкрдХреЛ рдЯрд╛рдЗрдкрдореЗрдХрд░ рд╕реЗ рдЯрд╛рдЗрдк-рдХреНрд▓реЗрдореЗрдВрдЯ рд╡рд╛рдкрд╕ рдкрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
private TypeElement asTypeElement(TypeMirror typeMirror) { return (TypeElement)processingEnv.getTypeUtils().asElement(typeMirror); }
TypeKind (
javax.lang.model.type.TypeKind ) - рдПрдХ рдЧрдгрдирд╛ рдЬреЛ рдЖрдкрдХреЛ рдЯрд╛рдЗрдк рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ, рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдкреНрд░рдХрд╛рд░ рдПрдХ рд╕рд░рдгреА (ARRAY), рдПрдХ рдХрд╕реНрдЯрдо рдкреНрд░рдХрд╛рд░ (DECLARED), рдПрдХ рдкреНрд░рдХрд╛рд░ рдЪрд░ (TYPEVAR), рдЖрджрд┐ рд╣реИред рдЖрдк рдЗрд╕реЗ
TypeMirror.getKind()
рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
ElementKind (
javax.lang.model.element.ElementKind ) - рдЧрдгрдирд╛, рдЖрдкрдХреЛ рддрддреНрд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдХреНрдпрд╛ рддрддреНрд╡ рдПрдХ рдкреИрдХреЗрдЯ (рдкреИрдХреЗрдЬ), рд╡рд░реНрдЧ (рдХреНрд▓рд╛рд╕), рд╡рд┐рдзрд┐ (METHOD), рдЗрдВрдЯрд░рдлрд╝реЗрд╕ (рдЗрдВрдЯрд░рдлреЗрд╕), рдЖрджрд┐ рд╣реИред
рдирд╛рдо (
javax.lang.model.element.Name ) - рддрддреНрд╡ рдХреЗ рдирд╛рдо рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдлрд╝реЗрд╕,
Element.getSimpleName()
рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдореВрд▓рддрдГ, рдпреЗ рдкреНрд░рдХрд╛рд░ рдореЗрд░реЗ рд▓рд┐рдП рдПрдХ рд╕рддреНрдпрд╛рдкрди рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдереЗред
рдореИрдВ рдПрдХ рдФрд░ рджрд┐рд▓рдЪрд╕реНрдк рд╡рд┐рд╢реЗрд╖рддрд╛ рдиреЛрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдЧреНрд░рд╣рдг рдореЗрдВ рддрддреНрд╡ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди org.eclipse ... рд╕рдВрдХреБрд▓ рдореЗрдВ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬреЛ рддрддреНрд╡ рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддреЗ рд╣реИрдВ рд╡реЗ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ
org.eclipse.jdt.internal.compiler.apt.model.ExecutableElementImpl
ред рдЗрд╕рд╕реЗ рдореБрдЭреЗ рдпрд╣ рд╡рд┐рдЪрд╛рд░ рдЖрдпрд╛ рдХрд┐ рдпреЗ рдЗрдВрдЯрд░рдлреЗрд╕ рдкреНрд░рддреНрдпреЗрдХ рдЖрдИрдбреАрдИ рджреНрд╡рд╛рд░рд╛ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред
рдорд╛рдиреНрдпрддрд╛ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо
рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рдПрдиреЛрдЯреЗрд╢рди рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рдХреБрдЫ рд▓рд┐рдЦрд╛ рдЬрд╛ рдЪреБрдХрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,
рдпрд╣рд╛рдБ ), рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕ рдкрд░ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдзреНрдпрд╛рди рдирд╣реАрдВ рджреВрдВрдЧрд╛ред рдореИрдВ рдХреЗрд╡рд▓ рдпрд╣ рдХрд╣ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рджреЛ рдПрдиреЛрдЯреЗрд╢рди
@Retention
рдФрд░
@Retention
рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдкрд╣рд▓рд╛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╣рдорд╛рд░рд╛ рдПрдиреЛрдЯреЗрд╢рди рдХреЗрд╡рд▓ рд╡рд┐рдзрд┐ рдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рджреВрд╕рд░рд╛ рдпрд╣ рдХрд┐ рдПрдиреЛрдЯреЗрд╢рди рдХреЗрд╡рд▓ рд╕реНрд░реЛрдд рдХреЛрдб рдореЗрдВ рд╣реА рдореМрдЬреВрдж рд╣реЛрдЧрд╛ред
рдПрдиреЛрдЯреЗрд╢рди рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдХреМрди рд╕рд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдПрдиреЛрдЯреЗрдЯ рд╡рд┐рдзрд┐ (рдЬрд┐рд╕ рд╡рд┐рдзрд┐ рдкрд░ рдПрдиреЛрдЯреЗрд╢рди рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ) рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рджреЛ рддрд░реАрдХреЛрдВ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: рдпрд╛ рддреЛ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдкреВрд░рд╛ рдирд╛рдо рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП
@Implement("com.ds.IInterface")
, рдпрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╡рд░реНрдЧ рдХреЛ рд╕реАрдзреЗ рдкрд╛рд╕ рдХрд░реЗрдВ:
@Implement(IInterface.class)
ред рджреВрд╕рд░рд╛ рддрд░реАрдХрд╛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдмреЗрд╣рддрд░ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдХрдВрдкрд╛рдЗрд▓рд░ рд╕рд╣реА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдирд╛рдо рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░реЗрдЧрд╛ред рд╡реИрд╕реЗ, рдпрджрд┐ рдЖрдк рдЗрд╕ рд╕рджрд╕реНрдп
рдореВрд▓реНрдп () рдХреЛ рдХрд╣рддреЗ рд╣реИрдВ, рддреЛ рд╡рд┐рдзрд┐ рдореЗрдВ рдПрдиреЛрдЯреЗрд╢рди рдЬреЛрдбрд╝рддреЗ рд╕рдордп, рдЖрдкрдХреЛ рдЗрд╕ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рдирд╛рдо рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреАред
@Target({ElementType.METHOD}) @Retention(RetentionPolicy.SOURCE) public @interface Implement { Class<?> value(); }
рдлрд┐рд░ рдордЬрд╝рд╛ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ - рдкреНрд░реЛрд╕реЗрд╕рд░ рдХрд╛ рдирд┐рд░реНрдорд╛рдгред рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╡рд┐рдзрд┐ рдореЗрдВ, рд╣рдореЗрдВ рд╕рднреА рдПрдиреЛрдЯреЗрдЯ рддрддреНрд╡реЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдорд┐рд▓рддреА рд╣реИред рдлрд┐рд░ рд╣рдореЗрдВ рдПрдиреЛрдЯреЗрд╢рди рд╕реНрд╡рдпрдВ рдФрд░ рдЗрд╕рдХрд╛ рдЕрд░реНрде - рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдорд┐рд▓рддрд╛ рд╣реИред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреНрд▓рд╛рд╕ рдлреНрд░реЗрдорд╡рд░реНрдХ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
@SupportedAnnotationTypes({"ds.magic.annotations.compileTime.Implement"}) @SupportedSourceVersion(SourceVersion.RELEASE_8) public class ImplementProcessor extends AbstractProcessor { private Types typeUtils; @Override public void init(ProcessingEnvironment procEnv) { super.init(procEnv); typeUtils = this.processingEnv.getTypeUtils(); } @Override public boolean process(Set<? extends TypeElement> annos, RoundEnvironment env) { Set<? extends Element> annotatedElements = env.getElementsAnnotatedWith(Implement.class); for(Element annotated : annotatedElements) { Implement annotation = annotatedElement.getAnnotation(Implement.class); TypeMirror interfaceMirror = getValueMirror(annotation); TypeElement interfaceType = asTypeElement(interfaceMirror);
рдореИрдВ рдпрд╣ рдиреЛрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдЖрдк рдмрд╕ рд╡реИрд╕реЗ рд╣реА рдореВрд▓реНрдп рдирд┐рд░реНрдзрд╛рд░рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЬрдм рдЖрдк
annotation.value()
рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдПрдХ MirrororedTypeException рдХреЛ рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди рдЗрд╕рдореЗрдВ рд╕реЗ рдЖрдк рдПрдХ TypeMirror рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдзреЛрдЦрд╛ рд╡рд┐рдзрд┐, рд╕рд╛рде рд╣реА рдореВрд▓реНрдп рдХреА рд╕рд╣реА рд░рд╕реАрдж, рдореИрдВрдиреЗ
рдпрд╣рд╛рдВ рдкрд╛рдпрд╛:
private TypeMirror getValueMirror(Implement annotation) { try { annotation.value(); } catch(MirroredTypeException e) { return e.getTypeMirror(); } return null; }
рдЪреЗрдХ рдореЗрдВ рддреАрди рднрд╛рдЧ рд╣реЛрддреЗ рд╣реИрдВ, рдпрджрд┐ рдЙрдирдореЗрдВ рд╕реЗ рдХрдо рд╕реЗ рдХрдо рдПрдХ рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдПрдХ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдФрд░ рдЕрдЧрд▓реЗ рдПрдиреЛрдЯреЗрд╢рди рдкрд░ рдЖрдЧреЗ рдмрдврд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╡реИрд╕реЗ, рдЖрдк рдирд┐рдореНрди рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
private void printError(String message, Element annotatedElement) { Messager messager = processingEnv.getMessager(); messager.printMessage(Kind.ERROR, message, annotatedElement); }
рдкрд╣рд▓рд╛ рдХрджрдо рдпрд╣ рдЬрд╛рдВрдЪрдирд╛ рд╣реИ рдХрд┐ рдорд╛рди рдПрдиреЛрдЯреЗрд╢рди рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИ рдпрд╛ рдирд╣реАрдВред рдпрд╣рд╛рдБ рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИ:
if (interfaceType.getKind() != ElementKind.INTERFACE) { String name = Implement.class.getSimpleName(); printError("Value of @" + name + " must be an interface", annotated); continue; }
рдЕрдЧрд▓рд╛, рдЖрдкрдХреЛ рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╡рд░реНрдЧ рдЬрд┐рд╕рдореЗрдВ рдПрдиреЛрдЯреЗрдЯ рд╡рд┐рдзрд┐ рд╕реНрдерд┐рдд рд╣реИ рд╡рд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рдкрд╣рд▓реЗ рддреЛ рдореИрдВрдиреЗ рдореВрд░реНрдЦрддрд╛ рд╕реЗ рдЗрд╕ рдкрд░реАрдХреНрд╖рд╛ рдХреЛ рдЕрдкрдиреЗ рд╣рд╛рдереЛрдВ рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ред рд▓реЗрдХрд┐рди рдлрд┐рд░, рдЕрдЪреНрдЫреА рд╕рд▓рд╛рд╣ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдореИрдВрдиреЗ
рдЯрд╛рдЗрдкреНрд╕ рдХреЛ рджреЗрдЦрд╛ рдФрд░ рд╡рд╣рд╛рдВ
Types.isSubtype()
рд╡рд┐рдзрд┐
Types.isSubtype()
, рдЬреЛ рд╕рдВрдкреВрд░реНрдг рд╡рдВрд╢рд╛рдиреБрдХреНрд░рдо рдЯреНрд░реА рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдЧреА рдФрд░ рдпрджрд┐ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИ рддреЛ рд╡рд╛рдкрд╕ рд▓реМрдЯреЗрдВрдЧреАред рдорд╣рддреНрд╡рдкреВрд░реНрдг рд░реВрдк рд╕реЗ, рдпрд╣ рдкрд╣рд▓реЗ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд╡рд┐рдкрд░реАрдд, рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИред
TypeElement enclosingType = (TypeElement)annotatedElement.getEnclosingElement(); if (!typeUtils.isSubtype(enclosingType.asType(), interfaceMirror)) { Name className = enclosingType.getSimpleName(); Name interfaceName = interfaceType.getSimpleName(); printError(className + " must implemet " + interfaceName, annotated); continue; }
рдЕрдВрдд рдореЗрдВ, рдЖрдкрдХреЛ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдПрдиреЛрдЯреЗрдЯ рдХреЗ рд╕рдорд╛рди рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд┐рдзрд┐ рд╣реИред рдореИрдВ
Types.isSubsignature()
рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛
Types.isSubsignature()
, рд▓реЗрдХрд┐рди, рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдпрд╣ рд╡рд┐рдзрд┐ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддреА рд╣реИ рдпрджрд┐ рд╡рд┐рдзрд┐ рдЯрд╛рдЗрдк рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИред рддреЛ рд╣рдо рдЕрдкрдиреА рдЖрд╕реНрддреАрди рдКрдкрд░ рд░реЛрд▓ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЕрдкрдиреЗ рд╣рд╛рдереЛрдВ рд╕реЗ рд╕рднреА рдЪреЗрдХ рд▓рд┐рдЦрддреЗ рд╣реИрдВред рдФрд░ рд╣рдо рдЙрдирдореЗрдВ рд╕реЗ рддреАрди рдлрд┐рд░ рд╕реЗ рд╣реИрдВред рдареАрдХ рд╣реИ, рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ, рд╡рд┐рдзрд┐ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдореЗрдВ рддреАрди рднрд╛рдЧ рд╣реЛрддреЗ рд╣реИрдВ: рд╡рд┐рдзрд┐ рдХрд╛ рдирд╛рдо, рд░рд┐рдЯрд░реНрди рдорд╛рди рдХрд╛ рдкреНрд░рдХрд╛рд░ рдФрд░ рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рд╕реВрдЪреАред рдЖрдкрдХреЛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд╕рднреА рддрд░реАрдХреЛрдВ рд╕реЗ рдЧреБрдЬрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ рдФрд░ рддреАрдиреЛрдВ рдЪреЗрдХ рдкрд╛рд╕ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреЛ рдвреВрдВрдврдирд╛ рд╣реЛрдЧрд╛ред рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдпрд╣ рди рднреВрд▓реЗрдВ рдХрд┐ рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реА рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдХреЙрд▓ рдХреЛ рд▓реВрдк рдХреЗ рдЕрдВрдд рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреИрд╕реЗ:
if (!haveMethod(interfaceType, (ExecutableElement)annotatedElement)) { Name name = interfaceType.getSimpleName(); printError(name + " don't have \"" + annotated + "\" method", annotated); continue; }
рдФрд░ hasMethod () рд╡рд┐рдзрд┐ рдЦреБрдж рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддреА рд╣реИ:
private boolean haveMethod(TypeElement interfaceType, ExecutableElement method) { Name methodName = method.getSimpleName(); for (Element interfaceElement : interfaceType.getEnclosedElements()) { if (interfaceElement instanceof ExecutableElement) { ExecutableElement interfaceMethod = (ExecutableElement)interfaceElement;
рд╕рдорд╕реНрдпрд╛ рджреЗрдЦреЗрдВ? рдирд╣реАрдВ? рдФрд░ рд╡рд╣ рд╡рд╣рд╛рдБ рд╣реИред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдЬреЗрдиреЗрд░рд┐рдХ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рдорд┐рд▓рд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдРрд╕рд╛ рд╡рд░реНрдЧ рд╣реИ рдЬреЛ
рд╡рд┐рдзреЗрдп рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ:
MyPredicate implements Predicate<String> { @Implement(Predicate.class) boolean test(String t) { return false; } }
рдХрдХреНрд╖рд╛ рдореЗрдВ рд╡рд┐рдзрд┐ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рддреЗ рд╕рдордп, рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдкреНрд░рдХрд╛рд░
String
, рдФрд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдпрд╣
T
, рдФрд░ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп
String
рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд╕рднреА рдкреНрд░рдпрд╛рд╕реЛрдВ рд╕реЗ рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реБрдЖред рдЕрдВрдд рдореЗрдВ, рдореИрдВ рдХреЗрд╡рд▓ рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рдиреЗ рд╕реЗ рдмреЗрд╣рддрд░ рдХреБрдЫ рдирд╣реАрдВ рд╣реБрдЖред рдЪреЗрдХ рдХрд┐рд╕реА рднреА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рднрд▓реЗ рд╣реА рд╡реЗ рдореЗрд▓ рди рдЦрд╛рддреЗ рд╣реЛрдВред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдХрдВрдкрд╛рдЗрд▓рд░ рдПрдХ рддреНрд░реБрдЯрд┐ рдХреЛ рдлреЗрдВрдХ рджреЗрдЧрд╛ рдпрджрд┐ рд╡рд┐рдзрд┐ рдХрд╛ рдХреЛрдИ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдирд╣реАрдВ рд╣реИ рдФрд░ рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рдореЗрдВ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА, рдЕрдЧрд░ рдХрд┐рд╕реА рдХреЛ рдкрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╣реИ, рддреЛ рдореИрдВ рд╕рдВрдХреЗрдд рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЖрднрд╛рд░реА рд░рд╣реВрдВрдЧрд╛ред
рдЧреНрд░рд╣рдг рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВ
рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ, рдореИрдВ рдПрдХреНрд▓рд┐рдкреНрд╕ рд╕реЗ рдкреНрдпрд╛рд░ рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдореЗрд░реЗ рдЕрднреНрдпрд╛рд╕ рдореЗрдВ рдореИрдВрдиреЗ рдХреЗрд╡рд▓ рдЗрд╕рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ред рдЗрд╕рд▓рд┐рдП, рдореИрдВ рд╡рд░реНрдгрди рдХрд░реВрдВрдЧрд╛ рдХрд┐ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЛ рдЗрд╕ рдЖрдИрдбреАрдИ рд╕реЗ рдХреИрд╕реЗ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдПред рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЧреНрд░рд╣рдг рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЗрд╕реЗ рдПрдХ рдЕрд▓рдЧ .JAR рдореЗрдВ рдкреИрдХ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЬрд┐рд╕рдореЗрдВ рдПрдиреЛрдЯреЗрд╢рди рднреА рдЦреБрдж рд╣реЛрдЧрд╛ред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдЖрдкрдХреЛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ
META-INF / Services рдлрд╝реЛрд▓реНрдбрд░ рдмрдирд╛рдиреЗ рдФрд░
рд╡рд╣рд╛рдВ javax.annotation.processing.Processor рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдиреЗ рдФрд░ рдкреНрд░реЛрд╕реЗрд╕рд░ рд╡рд░реНрдЧ рдХрд╛ рдкреВрд░рд╛ рдирд╛рдо рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
ds.magic.annotations.compileTime.ImplementProcessor
, рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВред рдмрд╕ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдореИрдВ рдПрдХ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рджреЗ рджреВрдБрдЧрд╛, рд▓реЗрдХрд┐рди рдЬрдм рдореЗрд░реЗ рд▓рд┐рдП рдХреБрдЫ рднреА рдХрд╛рдо рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛, рддреЛ рдореИрдВрдиреЗ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рд╕рдВрд░рдЪрдирд╛ рдкрд░ рд▓рдЧрднрдЧ рдкрд╛рдк рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ред

рдЕрдЧрд▓рд╛, .JAR рдЗрдХрдЯреНрдард╛ рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВ, рдкрд╣рд▓реЗ рдПрдХ рдирд┐рдпрдорд┐рдд рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд░реВрдк рдореЗрдВ, рддрд╛рдХрд┐ рдПрдиреЛрдЯреЗрд╢рди рдХреЛрдб рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗред рдлрд┐рд░ рд╣рдо рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЛ рдХрдиреЗрдХреНрдЯ рдХрд░рддреЗ рд╣реИрдВ (
рдпрд╣рд╛рдВ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддреГрдд рд╣реИ)ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП,
рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЧреБрдг рдЦреЛрд▓реЗрдВ рдФрд░ рдЪреБрдиреЗрдВ:
- рдЬрд╛рд╡рд╛ рдХрдВрдкрд╛рдЗрд▓рд░ -> рдПрдиреЛрдЯреЗрд╢рди рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдФрд░ "рдПрдиреЛрдЯреЗрд╢рди рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рд╕рдХреНрд╖рдо рдХрд░реЗрдВ" рдмреЙрдХреНрд╕ рдХреЛ рдЪреЗрдХ рдХрд░реЗрдВред
- рдЬрд╛рд╡рд╛ рдХрдВрдкрд╛рдЗрд▓рд░ -> рдПрдиреЛрдЯреЗрд╢рди рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ -> рдлреИрдХреНрдЯреНрд░реА рдкрде "рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рд╕рдХреНрд╖рдо рдХрд░реЗрдВ" рдЪреЗрдХрдмреЙрдХреНрд╕ рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВред рдлрд┐рд░ Add JARs ... рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ рдФрд░ рдкрд╣рд▓реЗ рд╕реЗ рдирд┐рд░реНрдорд┐рдд JAR рдлрд╝рд╛рдЗрд▓ рдЪреБрдиреЗрдВред
- рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдкреБрдирд░реНрдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рд╕рд╣рдордд рд╣реИрдВред
рдкрд░рд┐рдгрд╛рдо
рд╕рднреА рдПрдХ рд╕рд╛рде рдФрд░ рдЧреНрд░рд╣рдг рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ
GitHub рдкрд░ рджреЗрдЦреЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдЦрди рдХреЗ рд╕рдордп, рдХреЗрд╡рд▓ рджреЛ рд╡рд░реНрдЧ рд╣реЛрддреЗ рд╣реИрдВ, рдпрджрд┐ рдПрдиреЛрдЯреЗрд╢рди рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: Implement.java рдФрд░ ImplementProcessor.javaред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЙрдирдХреЗ рдЙрджреНрджреЗрд╢реНрдп рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рдЪреБрдХреЗ рд╣реИрдВред
рд╢рд╛рдпрдж рдпрд╣ рдПрдиреЛрдЯреЗрд╢рди рдХреБрдЫ рдмреЗрдХрд╛рд░ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИред рд╢рд╛рдпрдж рдпрд╣ рд╣реИред рд▓реЗрдХрд┐рди рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ, рдореИрдВ рдЦреБрдж
@Override
рдмрдЬрд╛рдп рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рдЬрдм рд╡рд┐рдзрд┐ рдХреЗ рдирд╛рдо рдХрдХреНрд╖рд╛ рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рдореЗрдВ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдлрд┐рдЯ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВред рдФрд░ рдЕрдм рддрдХ, рдореБрдЭреЗ рдЙрд╕рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдиреЗ рдХреА рдХреЛрдИ рдЗрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдореИрдВрдиреЗ рдЕрдкрдиреЗ рд▓рд┐рдП рдПрдХ рдПрдиреЛрдЯреЗрд╢рди рдмрдирд╛рдпрд╛, рдФрд░ рд▓реЗрдЦ рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдпрд╣ рджрд┐рдЦрд╛рдирд╛ рдерд╛ рдХрд┐ рдореИрдВ рдХрд┐рд╕ рд░реЗрдХ рдкрд░ рд╣рдорд▓рд╛ рдХрд░ рд░рд╣рд╛ рдерд╛ред рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдРрд╕рд╛ рдХрд┐рдпрд╛ред рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред
рдкреБрдирд╢реНрдЪред рдмрдЧреНрд╕ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХреЗ рд▓рд┐рдП
ohotNik_alex рдФрд░
Comdiv рдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдзрдиреНрдпрд╡рд╛рджред