{"id":315055,"date":"2020-12-17T15:01:52","date_gmt":"2020-12-17T15:01:52","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=315055"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=315055","title":{"rendered":"\u041f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438 \u0432 Java \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f Telegram-\u0431\u043e\u0442\u0430"},"content":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\">\u0420\u0435\u0444\u043b\u0435\u043a\u0441\u0438\u044f \u0432 Java \u2014 \u044d\u0442\u043e \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0435 API \u0438\u0437 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f.<\/p>\n<p>  \u0411\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c \u0442\u0430\u043a \u0438\u043b\u0438 \u0438\u043d\u0430\u0447\u0435 \u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0440\u0435\u0444\u043b\u0435\u043a\u0441\u0438\u0435\u0439 \u0432 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0435\u0433\u043e \u0432\u0438\u0434\u0430\u0445, \u0432\u0435\u0434\u044c \u0435\u0433\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0442\u0440\u0443\u0434\u043d\u043e \u0443\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435.<\/p>\n<p>  \u041c\u043d\u043e\u0433\u0438\u0435 \u043e\u0442\u0432\u0435\u0442\u044b \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u043d\u0430 \u044d\u0442\u043e\u043c, \u043d\u043e \u0447\u0442\u043e \u0431\u043e\u043b\u0435\u0435 \u0432\u0430\u0436\u043d\u043e, \u044d\u0442\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u0432\u043e\u043e\u0431\u0449\u0435 \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u0438 \u0440\u0435\u0444\u043b\u0435\u043a\u0441\u0438\u0438. \u041c\u044b \u0433\u043e\u043d\u0438\u043c\u0441\u044f \u0437\u0430 \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u043c\u0438 \u043e\u0442\u0432\u0435\u0442\u0430\u043c\u0438 \u043d\u0430 \u0432\u043e\u043f\u0440\u043e\u0441\u044b, \u0447\u0442\u043e\u0431\u044b \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u043f\u0440\u043e\u0439\u0442\u0438 \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435, \u043d\u043e \u043d\u0435 \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u043c \u043e\u0441\u043d\u043e\u0432\u044b \u2014 \u043e\u0442\u043a\u0443\u0434\u0430 \u044d\u0442\u043e \u0432\u0437\u044f\u043b\u043e\u0441\u044c \u0438 \u0447\u0442\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c \u043f\u043e\u0434 \u0440\u0435\u0444\u043b\u0435\u043a\u0441\u0438\u0435\u0439.<\/p>\n<p>  \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u043a\u043e\u0441\u043d\u0435\u043c\u0441\u044f \u0432\u0441\u0435\u0445 \u044d\u0442\u0438\u0445 \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043a \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044f\u043c \u0438 \u043d\u0430 \u0436\u0438\u0432\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0443\u0432\u0438\u0434\u0438\u043c \u043a\u0430\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c, \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c \u0438 \u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u044e.<\/p>\n<p>  <a href=\"https:\/\/habr.com\/ru\/company\/skillfactory\/blog\/533478\/\"><\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/vt\/ft\/8q\/vtft8qmh5jun98oizgt1wkuctli.jpeg\"><\/div>\n<p><\/a><a name=\"habracut\"><\/a>  <\/p>\n<hr>\n<p>  <font color=\"#09b744\"><\/p>\n<h2>\u0420\u0435\u0444\u043b\u0435\u043a\u0441\u0438\u044f<\/h2>\n<p><\/font><\/p>\n<p>  \u042f \u0441\u0447\u0438\u0442\u0430\u044e, \u0447\u0442\u043e \u043e\u0448\u0438\u0431\u043e\u0447\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0434\u0443\u043c\u0430\u0442\u044c, \u0447\u0442\u043e \u0440\u0435\u0444\u043b\u0435\u043a\u0441\u0438\u044f \u0432 Java \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043b\u0438\u0448\u044c \u043a\u0430\u043a\u0438\u043c-\u0442\u043e \u043f\u0430\u043a\u0435\u0442\u043e\u043c \u0432 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0435\u0433\u043e \u043a\u0430\u043a \u0442\u0435\u0440\u043c\u0438\u043d, \u043d\u0435 \u043f\u0440\u0438\u0432\u044f\u0437\u044b\u0432\u0430\u044f \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u043c\u0443 \u043f\u0430\u043a\u0435\u0442\u0443.<\/p>\n<p>  <font color=\"#09b744\"><\/p>\n<h3>Reflection vs Introspection<\/h3>\n<p><\/font><br \/>  \u041d\u0430\u0440\u044f\u0434\u0443 \u0441 \u0440\u0435\u0444\u043b\u0435\u043a\u0441\u0438\u0435\u0439 \u0442\u0430\u043a\u0436\u0435 \u0435\u0441\u0442\u044c \u043f\u043e\u043d\u044f\u0442\u0438\u0435 \u0438\u043d\u0442\u0440\u043e\u0441\u043f\u0435\u043a\u0446\u0438\u0438. \u0418\u043d\u0442\u0440\u043e\u0441\u043f\u0435\u043a\u0446\u0438\u044f \u2014 \u044d\u0442\u043e \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u043e \u0442\u0438\u043f\u0435 \u0438 \u0434\u0440\u0443\u0433\u0438\u0445 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u0430. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u044d\u0442\u043e <code>instanceof<\/code>:<\/p>\n<pre><code class=\"java\">if (obj instanceof Cat) {    Cat cat = (Cat) obj;    cat.meow(); }<\/code><\/pre>\n<p>  \u042d\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u0441\u0438\u043b\u044c\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434, \u0431\u0435\u0437 \u0447\u0435\u0433\u043e Java \u043d\u0435 \u0431\u044b\u043b\u0430 \u0431\u044b \u0442\u0430\u043a\u043e\u0439, \u043a\u0430\u043a\u0430\u044f \u043e\u043d\u0430 \u0435\u0441\u0442\u044c. \u0422\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435 \u0434\u0430\u043b\u044c\u0448\u0435 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u043e\u043d \u043d\u0435 \u0443\u0445\u043e\u0434\u0438\u0442, \u0438 \u0432 \u0434\u0435\u043b\u043e \u0432\u0441\u0442\u0443\u043f\u0430\u0435\u0442 \u0440\u0435\u0444\u043b\u0435\u043a\u0441\u0438\u044f.<\/p>\n<p>  <font color=\"#09b744\"><\/p>\n<h3>\u041d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0440\u0435\u0444\u043b\u0435\u043a\u0441\u0438\u0438<\/h3>\n<p><\/font><br \/>  \u0415\u0441\u043b\u0438 \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u0435\u0435, \u0442\u043e \u0440\u0435\u0444\u043b\u0435\u043a\u0441\u0438\u044f \u2014 \u044d\u0442\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c \u0441\u0435\u0431\u044f \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043d\u0435\u0451 \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u0441\u0432\u043e\u0451 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435.<\/p>\n<p>  \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0439 \u0432\u044b\u0448\u0435, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0435 \u0440\u0435\u0444\u043b\u0435\u043a\u0441\u0438\u0435\u0439, \u0430 \u043b\u0438\u0448\u044c \u0438\u043d\u0442\u0440\u043e\u0441\u043f\u0435\u043a\u0446\u0438\u0435\u0439 \u0442\u0438\u043f\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u0430. \u041d\u043e \u0447\u0442\u043e \u0436\u0435 \u0442\u043e\u0433\u0434\u0430 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0440\u0435\u0444\u043b\u0435\u043a\u0441\u0438\u0435\u0439? \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043a\u043b\u0430\u0441\u0441\u0430 \u0438\u043b\u0438 \u0432\u044b\u0437\u043e\u0432 \u043c\u0435\u0442\u043e\u0434\u0430, \u043d\u043e \u0432\u0435\u0441\u044c\u043c\u0430 \u0441\u0432\u043e\u0435\u043e\u0431\u0440\u0430\u0437\u043d\u044b\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c. \u041d\u0438\u0436\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0443 \u043f\u0440\u0438\u043c\u0435\u0440.<\/p>\n<p>  \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c, \u0447\u0442\u043e \u0443 \u043d\u0430\u0441 \u043d\u0435\u0442 \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u0437\u043d\u0430\u043d\u0438\u0439 \u043e \u043a\u043b\u0430\u0441\u0441\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0441\u043e\u0437\u0434\u0430\u0442\u044c, \u0430 \u043b\u0438\u0448\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f, \u0433\u0434\u0435 \u043e\u043d \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f. \u0412 \u0442\u0430\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043a\u043b\u0430\u0441\u0441 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u044b\u043c \u043f\u0443\u0442\u0451\u043c:<\/p>\n<pre><code class=\"java\">Object obj = new Cat();    \/\/ \u0430 \u043a\u0443\u0434\u0430 \u043a\u043e\u0448\u043a\u0430 \u043f\u0440\u043e\u043f\u0430\u043b\u0430?<\/code><\/pre>\n<p>  \u0412\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u0440\u0435\u0444\u043b\u0435\u043a\u0441\u0438\u0435\u0439 \u0438 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043a\u043b\u0430\u0441\u0441\u0430:<\/p>\n<pre><code class=\"java\">Object obj = Class.forName(&quot;complete.classpath.MyCat&quot;).newInstance();<\/code><\/pre>\n<p>  \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0442\u0430\u043a\u0436\u0435 \u0447\u0435\u0440\u0435\u0437 \u0440\u0435\u0444\u043b\u0435\u043a\u0441\u0438\u044e \u0432\u044b\u0437\u043e\u0432\u0435\u043c \u0435\u0433\u043e \u043c\u0435\u0442\u043e\u0434:<\/p>\n<pre><code class=\"java\">Method m = obj.getClass().getDeclaredMethod(&quot;meow&quot;); m.invoke(obj);<\/code><\/pre>\n<p>  \u041e\u0442 \u0442\u0435\u043e\u0440\u0438\u0438 \u043a \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435:<\/p>\n<pre><code class=\"java\">import java.lang.reflect.Method; import java.lang.Class;  public class Cat {      public void meow() {         System.out.println(&quot;Meow&quot;);     }          public static void main(String[] args) throws Exception {         Object obj = Class.forName(&quot;Cat&quot;).newInstance();          Method m = obj.getClass().getDeclaredMethod(&quot;meow&quot;);          m.invoke(obj);     } }<\/code><\/pre>\n<p>  \u041f\u043e\u0438\u0433\u0440\u0430\u0442\u044c \u0441 \u043d\u0438\u043c \u043c\u043e\u0436\u043d\u043e \u0432 <a href=\"https:\/\/jdoodle.com\/ia\/4Ye\">Jdoodle<\/a>.<br \/>  \u041d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u0443, \u0432 \u044d\u0442\u043e\u043c \u043a\u043e\u0434\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043c\u043d\u043e\u0433\u043e \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u0432\u0435\u0449\u0435\u0439, \u0438 \u0437\u0430\u0447\u0430\u0441\u0442\u0443\u044e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u0443 \u043d\u0435 \u0445\u0432\u0430\u0442\u0430\u0435\u0442 \u043b\u0438\u0448\u044c \u043f\u0440\u043e\u0441\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f <code>getDeclaredMethod and then invoke<\/code>.<\/p>\n<blockquote><p><strong>\u0412\u043e\u043f\u0440\u043e\u0441 #1<\/strong><br \/>  \u041f\u043e\u0447\u0435\u043c\u0443 \u0432 invoke \u043c\u0435\u0442\u043e\u0434\u0435 \u0432 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0441\u0432\u0435\u0440\u0445\u0443 \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043e\u0431\u044a\u0435\u043a\u0442\u0430?  <\/p><\/blockquote>\n<p>  \u0414\u0430\u043b\u0435\u0435 \u0443\u0433\u043b\u0443\u0431\u043b\u044f\u0442\u044c\u0441\u044f \u044f \u043d\u0435 \u0431\u0443\u0434\u0443, \u0442\u0430\u043a \u043a\u0430\u043a \u043c\u044b \u0443\u0439\u0434\u0451\u043c \u0434\u0430\u043b\u0435\u043a\u043e \u043e\u0442 \u0442\u0435\u043c\u044b. \u0412\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u044f \u043e\u0441\u0442\u0430\u0432\u043b\u044e \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 <a href=\"https:\/\/habr.com\/ru\/post\/318418\/\">\u0441\u0442\u0430\u0442\u044c\u044e<\/a> \u0441\u0442\u0430\u0440\u0448\u0435\u0433\u043e \u043a\u043e\u043b\u043b\u0435\u0433\u0438 <a href=\"https:\/\/habr.com\/ru\/users\/lany\/\">\u0422\u0430\u0433\u0438\u0440\u0430 \u0412\u0430\u043b\u0435\u0435\u0432\u0430<\/a>.<\/p>\n<p>  <font color=\"#09b744\"><\/p>\n<h2>\u0410\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438<\/h2>\n<p><\/font><br \/>  \u0412\u0430\u0436\u043d\u043e\u0439 \u0447\u0430\u0441\u0442\u044c\u044e \u044f\u0437\u044b\u043a\u0430 Java \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438. \u042d\u0442\u043e \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0432\u0435\u0441\u0438\u0442\u044c \u043d\u0430 \u043a\u043b\u0430\u0441\u0441, \u043f\u043e\u043b\u0435 \u0438\u043b\u0438 \u043c\u0435\u0442\u043e\u0434. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432\u044b \u043c\u043e\u0433\u043b\u0438 \u0432\u0438\u0434\u0435\u0442\u044c \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044e <code>@Override<\/code>:<\/p>\n<pre><code class=\"java\">public abstract class Animal {     abstract void doSomething(); }  public class Cat extends Animal {     @Override     public void doSomething() {         System.out.println(&quot;Meow&quot;);     }  }<\/code><\/pre>\n<p>  \u0417\u0430\u0434\u0443\u043c\u044b\u0432\u0430\u043b\u0438\u0441\u044c \u043b\u0438 \u0432\u044b, \u043a\u0430\u043a \u043e\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442? \u0415\u0441\u043b\u0438 \u043d\u0435 \u0437\u043d\u0430\u0435\u0442\u0435, \u0442\u043e, \u043f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u0447\u0438\u0442\u0430\u0442\u044c \u0434\u0430\u043b\u044c\u0448\u0435, \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u0434\u043e\u0433\u0430\u0434\u0430\u0442\u044c\u0441\u044f.<\/p>\n<p>  <font color=\"#09b744\"><\/p>\n<h3>\u0422\u0438\u043f\u044b \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0439<\/h3>\n<p><\/font><br \/>  \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0432\u044b\u0448\u0435\u043f\u0440\u0438\u0432\u0435\u0434\u0451\u043d\u043d\u0443\u044e \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044e:<\/p>\n<pre><code class=\"java\">@Target(ElementType.METHOD) @Retention(RetentionPolicy.SOURCE) public @interface Override {  }<\/code><\/pre>\n<p>  <code>@Target<\/code>\u00a0\u2014 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043a \u0447\u0435\u043c\u0443 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c\u0430 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044f. \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u043a \u043c\u0435\u0442\u043e\u0434\u0443.<\/p>\n<p>  <code>@Retention<\/code>\u00a0\u2014 \u0434\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0436\u0438\u0437\u043d\u0438 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438 \u0432 \u043a\u043e\u0434\u0435 (\u043d\u0435 \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0430\u0445, \u0440\u0430\u0437\u0443\u043c\u0435\u0435\u0442\u0441\u044f).<\/p>\n<p>  <code>@interface<\/code> \u2014 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u043e\u043c \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0439.<\/p>\n<p>  \u0415\u0441\u043b\u0438 \u0441 \u043f\u0435\u0440\u0432\u044b\u043c \u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u043c \u0432\u0441\u0435 \u0431\u043e\u043b\u0435\u0435 \u043c\u0435\u043d\u0435\u0435 \u043f\u043e\u043d\u044f\u0442\u043d\u043e (\u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u0441\u043c.\u00a0<code>@Target<\/code>\u00a0\u0432\u00a0<a href=\"https:\/\/docs.oracle.com\/javase\/7\/docs\/api\/java\/lang\/annotation\/ElementType.html\">\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438<\/a>), \u0442\u043e\u00a0<code>@Retention<\/code>\u00a0\u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u0441\u0435\u0439\u0447\u0430\u0441, \u0442\u0430\u043a \u043a\u0430\u043a \u043e\u043d \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u044c \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438 \u043d\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0442\u0438\u043f\u043e\u0432, \u0447\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u0432\u0430\u0436\u043d\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c.<\/p>\n<p>  \u042d\u0442\u0430 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044f \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u0442\u0440\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f:<\/p>\n<ul>\n<li>RetentionPolicy.<a href=\"https:\/\/docs.oracle.com\/javase\/7\/docs\/api\/java\/lang\/annotation\/RetentionPolicy.html#CLASS\">CLASS<\/a><\/li>\n<li>RetentionPolicy.<a href=\"https:\/\/docs.oracle.com\/javase\/7\/docs\/api\/java\/lang\/annotation\/RetentionPolicy.html#RUNTIME\">RUNTIME<\/a><\/li>\n<li>RetentionPolicy.<a href=\"https:\/\/docs.oracle.com\/javase\/7\/docs\/api\/java\/lang\/annotation\/RetentionPolicy.html#SOURCE\">SOURCE<\/a><\/li>\n<\/ul>\n<p>  \u0412 \u043f\u0435\u0440\u0432\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044f \u0437\u0430\u043f\u0438\u0448\u0435\u0442\u0441\u044f \u0432 \u0431\u0430\u0439\u0442-\u043a\u043e\u0434 \u0432\u0430\u0448\u0435\u0433\u043e \u043a\u043e\u0434\u0430, \u043d\u043e \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u0430 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c\u0441\u044f \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u043e\u0439 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f.<\/p>\n<p>  \u0412\u043e \u0432\u0442\u043e\u0440\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430 \u0438 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f, \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0447\u0435\u043c\u0443 \u043c\u044b \u0441\u043c\u043e\u0436\u0435\u043c \u0435\u0451 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u0441\u0435 \u043a\u043b\u0430\u0441\u0441\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u043c\u0435\u044e\u0442 \u0434\u0430\u043d\u043d\u0443\u044e \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044e.<\/p>\n<p>  \u0412 \u0442\u0440\u0435\u0442\u044c\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u0443\u0434\u0430\u043b\u0435\u043d\u0430 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u043e\u043c (\u0435\u0451 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0432 \u0431\u0430\u0439\u0442-\u043a\u043e\u0434\u0435). \u041e\u0431\u044b\u0447\u043d\u043e \u044d\u0442\u043e \u0431\u044b\u0432\u0430\u044e\u0442 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u043b\u0435\u0437\u043d\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430.<\/p>\n<p>  \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044f\u0441\u044c \u043a \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438\u00a0<code>@Override<\/code>, \u043c\u044b \u0432\u0438\u0434\u0438\u043c, \u0447\u0442\u043e \u043e\u043d\u0430 \u0438\u043c\u0435\u0435\u0442\u00a0<code>RetentionPolicy.SOURCE<\/code>\u00a0\u0447\u0442\u043e \u0432 \u043e\u0431\u0449\u0435\u043c-\u0442\u043e \u043b\u043e\u0433\u0438\u0447\u043d\u043e, \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u044f, \u0447\u0442\u043e \u043e\u043d \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u043e\u043c. \u0412 \u0440\u0430\u043d\u0442\u0430\u0439\u043c\u0435 \u044d\u0442\u0430 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044f \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0438\u0447\u0435\u0433\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0433\u043e \u043d\u0435 \u0434\u0430\u0435\u0442.<\/p>\n<p>  <font color=\"#09b744\"><\/p>\n<h3>SuperCat<\/h3>\n<p><\/font><br \/>  \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0432\u043e\u044e \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044e (\u044d\u0442\u043e \u0437\u0434\u043e\u0440\u043e\u0432\u043e \u043d\u0430\u043c \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u0442\u0441\u044f \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438).<\/p>\n<pre><code class=\"java\">abstract class Cat {     abstract void meow(); }  public class Home {      private class Tom extends Cat {         @Override         void meow() {             System.out.println(&quot;Tom-style meow!&quot;); \/\/ &lt;---         }     }          private class Alex extends Cat {         @Override         void meow() {             System.out.println(&quot;Alex-style meow!&quot;); \/\/ &lt;---         }     } }<\/code><\/pre>\n<p>  \u041f\u0443\u0441\u0442\u044c \u0443 \u043d\u0430\u0441 \u0432 \u0434\u043e\u043c\u0435 \u0431\u0443\u0434\u0435\u0442 \u0434\u0432\u0430 \u043a\u043e\u0442\u0438\u043a\u0430: \u0422\u043e\u043c \u0438 \u0410\u043b\u0435\u043a\u0441. \u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044e \u0434\u043b\u044f \u0441\u0443\u043f\u0435\u0440\u043a\u043e\u0442\u0438\u043a\u0430:<\/p>\n<pre><code class=\"java\">@Target(ElementType.TYPE)     \/\/ \u0447\u0442\u043e\u0431\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u043a\u043b\u0430\u0441\u0441\u0430 @Retention(RetentionPolicy.RUNTIME)  \/\/ \u0445\u043e\u0442\u0438\u043c \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0448\u0430 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044f \u0434\u043e\u0436\u0438\u043b\u0430 \u0434\u043e \u0440\u0430\u043d\u0442\u0430\u0439\u043c\u0430 @interface SuperCat {  }  \/\/ ...      @SuperCat   \/\/ &lt;---     private class Alex extends Cat {         @Override         void meow() {             System.out.println(&quot;Alex-style meow!&quot;);         }     }  \/\/ ...<\/code><\/pre>\n<p>  \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0422\u043e\u043c\u0430 \u043c\u044b \u043e\u0441\u0442\u0430\u0432\u0438\u043c \u043e\u0431\u044b\u0447\u043d\u044b\u043c \u043a\u043e\u0442\u043e\u043c (\u043c\u0438\u0440 \u043d\u0435\u0441\u043f\u0440\u0430\u0432\u0435\u0434\u043b\u0438\u0432). \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043a\u043b\u0430\u0441\u0441\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u044b\u043b\u0438 \u0430\u043d\u043d\u043e\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u0434\u0430\u043d\u043d\u044b\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u043c. \u0411\u044b\u043b\u043e \u0431\u044b \u043d\u0435\u043f\u043b\u043e\u0445\u043e \u0438\u043c\u0435\u0442\u044c \u0442\u0430\u043a\u043e\u0439 \u043c\u0435\u0442\u043e\u0434 \u0443 \u0441\u0430\u043c\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438:<\/p>\n<pre><code class=\"java\">Set&lt;class&lt;?&gt;&gt; classes = SuperCat.class.getAnnotatedClasses();<\/code><\/pre>\n<p>  \u041d\u043e, \u043a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u0442\u0430\u043a\u043e\u0433\u043e \u043f\u043e\u043a\u0430 \u043c\u0435\u0442\u043e\u0434\u0430 \u043d\u0435\u0442. \u0422\u043e\u0433\u0434\u0430 \u043a\u0430\u043a \u043d\u0430\u043c \u043d\u0430\u0439\u0442\u0438 \u044d\u0442\u0438 \u043a\u043b\u0430\u0441\u0441\u044b?<\/p>\n<p>  <font color=\"#09b744\"><\/p>\n<h3>ClassPath<\/h3>\n<p><\/font><br \/>  \u042d\u0442\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0435 \u043a\u043b\u0430\u0441\u0441\u044b. <\/p>\n<blockquote><p>\u041d\u0430\u0434\u0435\u044e\u0441\u044c, \u0432\u044b \u0441 \u043d\u0438\u043c\u0438 \u0437\u043d\u0430\u043a\u043e\u043c\u044b, \u0430 \u0435\u0441\u043b\u0438 \u043d\u0435\u0442, \u0442\u043e \u0441\u043f\u0435\u0448\u0438\u0442\u0435 \u0438\u0437\u0443\u0447\u0438\u0442\u044c \u044d\u0442\u043e, \u0442\u0430\u043a \u043a\u0430\u043a \u044d\u0442\u043e \u043e\u0434\u043d\u0430 \u0438\u0437 \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u0432\u0435\u0449\u0435\u0439.<\/p><\/blockquote>\n<p>  \u0418\u0442\u0430\u043a, \u0443\u0437\u043d\u0430\u0432, \u0433\u0434\u0435 \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u043d\u0430\u0448\u0438 \u043a\u043b\u0430\u0441\u0441\u044b, \u043c\u044b \u0441\u043c\u043e\u0436\u0435\u043c \u0438\u0445 \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0447\u0435\u0440\u0435\u0437 ClassLoader \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u043a\u043b\u0430\u0441\u0441\u044b \u043d\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0434\u0430\u043d\u043d\u043e\u0439 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438. \u0421\u0440\u0430\u0437\u0443 \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u043c \u043a \u043a\u043e\u0434\u0443:<\/p>\n<pre><code class=\"java\">public static void main(String[] args) throws ClassNotFoundException {      String packageName = &quot;com.apploidxxx.examples&quot;;     ClassLoader classLoader = Home.class.getClassLoader();          String packagePath = packageName.replace('.', '\/');     URL urls = classLoader.getResource(packagePath);          File folder = new File(urls.getPath());     File[] classes = folder.listFiles();          for (File aClass : classes) {         int index = aClass.getName().indexOf(&quot;.&quot;);         String className = aClass.getName().substring(0, index);         String classNamePath = packageName + &quot;.&quot; + className;         Class&lt;?&gt; repoClass = Class.forName(classNamePath);              Annotation[] annotations = repoClass.getAnnotations();         for (Annotation annotation : annotations) {             if (annotation.annotationType() == SuperCat.class) {                 System.out.println(                   &quot;Detected SuperCat!!! It is &quot; + repoClass.getName()                 );             }         }          } }<\/code><\/pre>\n<p>  <strong>\u041d\u0435 \u0441\u043e\u0432\u0435\u0442\u0443\u044e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u043e \u0432 \u0432\u0430\u0448\u0435\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435. \u041a\u043e\u0434 \u043f\u0440\u0438\u0432\u0435\u0434\u0451\u043d \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0446\u0435\u043b\u0435\u0439!<\/strong><\/p>\n<p>  \u042d\u0442\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u043d, \u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0443\u0447\u0435\u0431\u043d\u044b\u0445 \u0446\u0435\u043b\u0435\u0439 \u0438\u0437-\u0437\u0430 \u044d\u0442\u043e\u0433\u043e:<\/p>\n<pre><code class=\"java\">Class&lt;?&gt; repoClass = Class.forName(classNamePath);<\/code><\/pre>\n<p>  \u0414\u0430\u043b\u044c\u0448\u0435 \u043c\u044b \u0443\u0437\u043d\u0430\u0435\u043c, \u043f\u043e\u0447\u0435\u043c\u0443. \u0410 \u043f\u043e\u043a\u0430 \u0440\u0430\u0437\u0431\u0435\u0440\u0451\u043c \u043f\u043e \u0441\u0442\u0440\u043e\u0447\u043a\u0430\u043c \u0432\u0435\u0441\u044c \u043a\u043e\u0434 \u0441\u0432\u0435\u0440\u0445\u0443:<\/p>\n<pre><code class=\"java\">\/\/ ...  \/\/ \u043f\u0430\u043a\u0435\u0442 \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043c\u044b \u0441\u0435\u0439\u0447\u0430\u0441 \u043d\u0430\u0445\u043e\u0434\u0438\u043c\u0441\u044f String packageName = &quot;com.apploidxxx.examples&quot;;  \/\/ \u0417\u0430\u0433\u0440\u0443\u0437\u0447\u0438\u043a \u043a\u043b\u0430\u0441\u0441\u043e\u0432, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043d\u0430\u0448\u0438 \u043a\u043b\u0430\u0441\u0441\u044b \u0438\u0437 \u0431\u0430\u0439\u0442-\u043a\u043e\u0434\u0430 ClassLoader classLoader = Home.class.getClassLoader();  \/\/ com.apploidxxx.examples -&gt; com\/apploidxxx\/examples String packagePath = packageName.replace('.', '\/'); URL urls = classLoader.getResource(packagePath);  File folder = new File(urls.getPath());  \/\/ \u041d\u0430\u0448\u0438 \u043a\u043b\u0430\u0441\u0441\u044b \u0432 \u0432\u0438\u0434\u0435 \u0444\u0430\u0439\u043b\u043e\u0432 File[] classes = folder.listFiles();  \/\/ ...<\/code><\/pre>\n<p>  \u0427\u0442\u043e\u0431\u044b \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f, \u043e\u0442\u043a\u0443\u0434\u0430 \u043c\u044b \u0431\u0435\u0440\u0451\u043c \u044d\u0442\u0438 \u0444\u0430\u0439\u043b\u044b, \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c JAR-\u0430\u0440\u0445\u0438\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f, \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435:<\/p>\n<pre><code class=\"plaintext\">\u251c\u2500\u2500\u2500com \u2502   \u2514\u2500\u2500\u2500apploidxxx \u2502       \u2514\u2500\u2500\u2500examples \u2502               Cat.class \u2502               Home$Alex.class \u2502               Home$Tom.class \u2502               Home.class \u2502               Main.class \u2502               SuperCat.class<\/code><\/pre>\n<p>  \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, <code>classes<\/code> \u2014 \u044d\u0442\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u0448\u0438 \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \u0432 \u0432\u0438\u0434\u0435 \u0431\u0430\u0439\u0442-\u043a\u043e\u0434\u0430. \u0422\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435 <code>File<\/code> \u2014 \u044d\u0442\u043e \u0435\u0449\u0451 \u043d\u0435 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u044b\u0439 \u0444\u0430\u0439\u043b, \u043c\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u043d\u0430\u0435\u043c, \u0433\u0434\u0435 \u043e\u043d\u0438 \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f, \u043d\u043e \u043c\u044b \u043f\u043e\u043a\u0430 \u043f\u043e-\u043f\u0440\u0435\u0436\u043d\u0435\u043c\u0443 \u043d\u0435 \u043c\u043e\u0436\u0435\u043c \u0432\u0438\u0434\u0435\u0442\u044c, \u0447\u0442\u043e \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432\u043d\u0443\u0442\u0440\u0438 \u043d\u0438\u0445.<\/p>\n<p>  \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u043c \u043a\u0430\u0436\u0434\u044b\u0439 \u0444\u0430\u0439\u043b:<\/p>\n<pre><code class=\"java\">for (File aClass : classes) {     \/\/ \u0438\u043c\u044f \u0444\u0430\u0439\u043b\u0430, \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435, Home.class, Home$Alex.class \u0438 \u0442\u0434     \/\/ \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0438\u0437\u0431\u0430\u0432\u0438\u0442\u044c\u0441\u044f \u043e\u0442 .class \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043f\u0443\u0442\u044c \u043a \u0444\u0430\u0439\u043b\u0443     \/\/ \u043a\u0430\u043a \u043a \u043e\u0431\u044a\u0435\u043a\u0442\u0443 \u0432\u043d\u0443\u0442\u0440\u0438 Java     int index = aClass.getName().indexOf(&quot;.&quot;);     String className = aClass.getName().substring(0, index);     String classNamePath = packageName + &quot;.&quot; + className;     \/\/ classNamePath = com.apploidxxx.examples.Home      Class&lt;?&gt; repoClass = Class.forName(classNamePath); }<\/code><\/pre>\n<p>  \u0412\u0441\u0451, \u0447\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u043d\u043e \u0440\u0430\u043d\u0435\u0435, \u0431\u044b\u043b\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u044d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 Class.forName, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0439 \u043d\u0430\u043c \u043a\u043b\u0430\u0441\u0441. \u0418\u0442\u0430\u043a, \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u2014 \u044d\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0432\u0441\u0435\u0445 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0439, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 \u043a\u043b\u0430\u0441\u0441 repoClass, \u0430 \u0437\u0430\u0442\u0435\u043c \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043b\u0438 \u043e\u043d\u0438 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0435\u0439 <code>@SuperCat<\/code>:<\/p>\n<pre><code class=\"java\">Annotation[] annotations = repoClass.getAnnotations(); for (Annotation annotation : annotations) {     if (annotation.annotationType() == SuperCat.class) {         System.out.println(           &quot;Detected SuperCat!!! It is &quot; + repoClass.getName()         );     } } output: Detected SuperCat!!! It is com.apploidxxx.examples.Home$Alex<\/code><\/pre>\n<p>  \u0418 \u0433\u043e\u0442\u043e\u0432\u043e! \u0422\u0435\u043f\u0435\u0440\u044c, \u043a\u043e\u0433\u0434\u0430 \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0441\u0430\u043c \u043a\u043b\u0430\u0441\u0441, \u0442\u043e \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0434\u043e\u0441\u0442\u0443\u043f \u043a\u043e \u0432\u0441\u0435\u043c \u043c\u0435\u0442\u043e\u0434\u0430\u043c \u0440\u0435\u0444\u043b\u0435\u043a\u0441\u0438\u0438.<\/p>\n<p>  <font color=\"#09b744\"><\/p>\n<h3>\u0420\u0435\u0444\u043b\u0435\u043a\u0441\u0438\u0440\u0443\u0435\u043c<\/h3>\n<p><\/font><br \/>  \u041a\u0430\u043a \u0438 \u0432 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0441\u0432\u0435\u0440\u0445\u0443, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043d\u0430\u0448\u0435\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430. \u041d\u043e \u043f\u0435\u0440\u0435\u0434 \u044d\u0442\u0438\u043c \u0440\u0430\u0437\u0431\u0435\u0440\u0451\u043c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0444\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0435\u0439.<\/p>\n<ul>\n<li>\u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u043a\u043e\u0448\u043a\u0430\u043c \u043d\u0430\u0434\u043e \u0433\u0434\u0435-\u0442\u043e \u0436\u0438\u0442\u044c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0438\u043c \u043d\u0443\u0436\u0435\u043d \u0434\u043e\u043c. \u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043e\u043d\u0438 \u043d\u0435 \u043c\u043e\u0433\u0443\u0442 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0431\u0435\u0437 \u0434\u043e\u043c\u0430.<\/li>\n<li>\u0412\u043e-\u0432\u0442\u043e\u0440\u044b\u0445, \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u0443\u043f\u0435\u0440\u043a\u043e\u0442\u043e\u0432.<\/li>\n<\/ul>\n<p>  <\/p>\n<pre><code class=\"java\">List&lt;cat&gt; superCats = new ArrayList&lt;&gt;(); final Home home = new Home();    \/\/ \u0434\u043e\u043c, \u0433\u0434\u0435 \u0431\u0443\u0434\u0443\u0442 \u0436\u0438\u0442\u044c \u043d\u0430\u0448\u0438 \u043a\u043e\u0442\u0438\u043a\u0438<\/code><\/pre>\n<p>  \u0418\u0442\u0430\u043a, \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043e\u0431\u0440\u0435\u0442\u0430\u0435\u0442 \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u0443\u044e \u0444\u043e\u0440\u043c\u0443:<\/p>\n<pre><code class=\"java\">for (Annotation annotation : annotations) {     if (annotation.annotationType() == SuperCat.class) {         Object obj = repoClass           .getDeclaredConstructor(Home.class)           .newInstance(home);         superCats.add((Cat) obj);     } }<\/code><\/pre>\n<p>  \u0418 \u0441\u043d\u043e\u0432\u0430 \u0440\u0443\u0431\u0440\u0438\u043a\u0430 \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432:<\/p>\n<blockquote><p><strong>\u0412\u043e\u043f\u0440\u043e\u0441 #2<\/strong><br \/>  \u0427\u0442\u043e \u0431\u0443\u0434\u0435\u0442, \u0435\u0441\u043b\u0438 \u043c\u044b \u043f\u043e\u043c\u0435\u0442\u0438\u043c <code>@SuperCat<\/code> \u043a\u043b\u0430\u0441\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0435 \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442\u0441\u044f \u043e\u0442 <code>Cat<\/code>?<\/p>\n<p>  <strong>\u0412\u043e\u043f\u0440\u043e\u0441 #3<\/strong><br \/>  \u041f\u043e\u0447\u0435\u043c\u0443 \u043d\u0430\u043c \u043d\u0443\u0436\u0435\u043d \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0442\u0438\u043f \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430 <code>Home<\/code>?<\/p><\/blockquote>\n<p>  \u041f\u043e\u0434\u0443\u043c\u0430\u0439\u0442\u0435 \u043f\u0430\u0440\u0443 \u043c\u0438\u043d\u0443\u0442, \u0430 \u0437\u0430\u0442\u0435\u043c \u0441\u0440\u0430\u0437\u0443 \u0440\u0430\u0437\u0431\u0435\u0440\u0451\u043c \u043e\u0442\u0432\u0435\u0442\u044b:<\/p>\n<p>  <strong>\u041e\u0442\u0432\u0435\u0442 #2<\/strong>: \u0411\u0443\u0434\u0435\u0442 <code>ClassCastException<\/code>, \u0442\u0430\u043a \u043a\u0430\u043a \u0441\u0430\u043c\u0430 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044f <code>@SuperCat<\/code> \u043d\u0435 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043a\u043b\u0430\u0441\u0441, \u043f\u043e\u043c\u0435\u0447\u0435\u043d\u043d\u044b\u0439 \u044d\u0442\u043e\u0439 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0435\u0439, \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0447\u0442\u043e-\u0442\u043e \u0438\u043b\u0438 \u0438\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u0442.<\/p>\n<p>  \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u044d\u0442\u043e, \u0443\u0431\u0440\u0430\u0432 <code>extends Cat<\/code> \u0443 Alex. \u0417\u0430\u043e\u0434\u043d\u043e \u0432\u044b \u0443\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044c \u0432 \u0442\u043e\u043c, \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0439 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044f <code>@Override<\/code>.<\/p>\n<p>  <strong>\u041e\u0442\u0432\u0435\u0442 #3<\/strong>: \u041a\u043e\u0448\u043a\u0430\u043c \u043d\u0443\u0436\u0435\u043d \u0434\u043e\u043c, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043e\u043d\u0438 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u043c\u0438 \u043a\u043b\u0430\u0441\u0441\u0430\u043c\u0438. \u0412\u0441\u0451 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 The Java Language Specification <a href=\"https:\/\/docs.oracle.com\/javase\/specs\/jls\/se8\/html\/jls-15.html#jls-15.9.3\">\u0433\u043b\u0430\u0432\u0430 15.9.3<\/a>.<\/p>\n<p>  \u0422\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u044d\u0442\u043e\u0433\u043e, \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0432 \u044d\u0442\u0438 \u043a\u043b\u0430\u0441\u0441\u044b \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438. \u041d\u043e \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u0440\u0435\u0444\u043b\u0435\u043a\u0441\u0438\u0435\u0439 \u0432\u044b \u0447\u0430\u0441\u0442\u043e \u0431\u0443\u0434\u0435\u0442\u0435 \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0441 \u0442\u0430\u043a\u043e\u0433\u043e \u0440\u043e\u0434\u0430 \u0432\u0435\u0449\u0430\u043c\u0438. \u0418 \u0432\u0430\u043c \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0434\u043e\u0441\u043a\u043e\u043d\u0430\u043b\u044c\u043d\u043e \u0437\u043d\u0430\u0442\u044c \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044e Java. \u042d\u0442\u0438 \u0432\u0435\u0449\u0438 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043b\u043e\u0433\u0438\u0447\u043d\u044b, \u0438 \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0434\u0443\u043c\u0430\u0442\u044c\u0441\u044f \u0441\u0430\u043c\u043e\u043c\u0443, \u043f\u043e\u0447\u0435\u043c\u0443 \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430, \u0435\u0441\u043b\u0438 \u043e\u043d <code>non-static<\/code>.<\/p>\n<p>  \u041f\u043e\u0434\u0432\u0435\u0434\u0451\u043c \u0438\u0442\u043e\u0433\u0438 \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u043c: <a href=\"https:\/\/github.com\/AppLoidx\/java-annotation-examples\/blob\/master\/src\/main\/java\/com\/apploidxxx\/examples\/nonstatic\/Home.java\">Home.java<\/a><\/p>\n<pre><code class=\"java\">package com.apploidxxx.examples;  import java.io.File; import java.lang.annotation.*; import java.lang.reflect.InvocationTargetException; import java.net.URL; import java.util.ArrayList; import java.util.List;  @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @interface SuperCat {  }  abstract class Cat {     abstract void meow(); }  public class Home {      public class Tom extends Cat {         @Override         void meow() {             System.out.println(&quot;Tom-style meow!&quot;);         }     }          @SuperCat     public class Alex extends Cat {         @Override         void meow() {             System.out.println(&quot;Alex-style meow!&quot;);         }     }          public static void main(String[] args) throws Exception {              String packageName = &quot;com.apploidxxx.examples&quot;;         ClassLoader classLoader = Home.class.getClassLoader();              String packagePath = packageName.replace('.', '\/');         URL urls = classLoader.getResource(packagePath);              File folder = new File(urls.getPath());         File[] classes = folder.listFiles();              List&lt;Cat&gt; superCats = new ArrayList&lt;&gt;();         final Home home = new Home();              for (File aClass : classes) {             int index = aClass.getName().indexOf(&quot;.&quot;);             String className = aClass.getName().substring(0, index);             String classNamePath = packageName + &quot;.&quot; + className;             Class&lt;?&gt; repoClass = Class.forName(classNamePath);             Annotation[] annotations = repoClass.getAnnotations();             for (Annotation annotation : annotations) {                 if (annotation.annotationType() == SuperCat.class) {                     Object obj = repoClass                       .getDeclaredConstructor(Home.class)                       .newInstance(home);                     superCats.add((Cat) obj);                 }             }         }              superCats.forEach(Cat::meow);     } } output: Alex-style meow!<\/code><\/pre>\n<p>  \u0422\u0430\u043a \u0447\u0442\u043e \u043d\u0435 \u0442\u0430\u043a \u0441 <code>Class.forName<\/code>?<\/p>\n<p>  \u0421\u0430\u043c \u043e\u043d \u043a\u0430\u043a \u0440\u0430\u0437-\u0442\u0430\u043a\u0438 \u0434\u0435\u043b\u0430\u0435\u0442 \u0432\u0441\u0451, \u0447\u0442\u043e \u043e\u0442 \u043d\u0435\u0433\u043e \u043d\u0443\u0436\u043d\u043e. \u0422\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435 \u043c\u044b \u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e.<\/p>\n<p>  \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u044c\u0442\u0435 \u0441\u0435\u0431\u0435, \u0447\u0442\u043e \u0432\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442\u0435 \u043d\u0430\u0434 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c 1000 \u0438 \u0431\u043e\u043b\u044c\u0448\u0435 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 (\u0432\u0441\u0451-\u0442\u0430\u043a\u0438 \u043d\u0430 Java \u043f\u0438\u0448\u0435\u043c). \u0418 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u044c\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u0431\u0443\u0434\u0435\u0442\u0435 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u043a\u0430\u0436\u0434\u044b\u0439 \u043a\u043b\u0430\u0441\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u0439\u0434\u0451\u0442\u0435 \u0432 classPath. \u0421\u0430\u043c\u0438 \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0442\u0435, \u0447\u0442\u043e \u043f\u0430\u043c\u044f\u0442\u044c \u0438 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u044b JVM \u043d\u0435 \u0440\u0435\u0437\u0438\u043d\u043e\u0432\u044b\u0435.<\/p>\n<p>  <font color=\"#09b744\"><\/p>\n<h2>\u0421\u043f\u043e\u0441\u043e\u0431\u044b \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044f\u043c\u0438<\/h2>\n<p><\/font><br \/>  \u0415\u0441\u043b\u0438 \u0431\u044b \u043d\u0435 \u0431\u044b\u043b\u043e \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u0441\u043f\u043e\u0441\u043e\u0431\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044f\u043c\u0438, \u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0438\u0445 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043c\u0435\u0442\u043e\u043a \u043a\u043b\u0430\u0441\u0441\u0430, \u043a\u0430\u043a, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432 Spring, \u0431\u044b\u043b\u043e \u0431\u044b \u0432\u0435\u0441\u044c\u043c\u0430 \u0438 \u0432\u0435\u0441\u044c\u043c\u0430 \u0441\u043f\u043e\u0440\u043d\u044b\u043c.<\/p>\n<p>  \u041d\u043e \u0432\u0441\u0451 \u0436\u0435 Spring \u0432\u0440\u043e\u0434\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442. \u041d\u0435\u0443\u0436\u0435\u043b\u0438 \u0438\u0437-\u0437\u0430 \u043d\u0438\u0445 \u043c\u043e\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0442\u0430\u043a\u0430\u044f \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u0430\u044f? \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e \u0438\u043b\u0438 \u043a \u0441\u0447\u0430\u0441\u0442\u044c\u044e, \u043d\u0435\u0442. Spring \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0438\u0441\u043f\u0440\u0430\u0432\u043d\u043e (\u0432 \u044d\u0442\u043e\u043c \u043f\u043b\u0430\u043d\u0435), \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0438\u043d\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043d\u0438\u043c\u0438.<\/p>\n<p>  <font color=\"#09b744\"><\/p>\n<h3>\u041f\u0440\u044f\u043c\u043e \u0432 \u0431\u0430\u0439\u0442-\u043a\u043e\u0434<\/h3>\n<p><\/font><br \/>  \u0412\u0441\u0435 (\u043d\u0430\u0434\u0435\u044e\u0441\u044c) \u0442\u0430\u043a \u0438\u043b\u0438 \u0438\u043d\u0430\u0447\u0435 \u0438\u043c\u0435\u044e\u0442 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435, \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u0431\u0430\u0439\u0442-\u043a\u043e\u0434. \u0412 \u043d\u0451\u043c \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0432\u0441\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u043d\u0430\u0448\u0438\u0445 \u043a\u043b\u0430\u0441\u0441\u0430\u0445 \u0438 \u0438\u0445 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445 (\u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0439).<\/p>\n<p>  \u041f\u043e\u0440\u0430 \u0432\u0440\u0435\u043c\u044f \u0432\u0441\u043f\u043e\u043c\u043d\u0438\u0442\u044c \u043d\u0430\u0448 <code>RetentionPolicy<\/code>. \u0412 \u043f\u0440\u043e\u0448\u043b\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043c\u044b \u0441\u043c\u043e\u0433\u043b\u0438 \u043d\u0430\u0439\u0442\u0438 \u044d\u0442\u0443 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044e, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0443\u043a\u0430\u0437\u0430\u043b\u0438, \u0447\u0442\u043e \u043e\u043d\u0430 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0440\u0430\u043d\u0442\u0430\u0439\u043c\u043e\u0432\u043e\u0439 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0435\u0439. \u0421\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u043e\u043d\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0445\u0440\u0430\u043d\u0438\u0442\u044c\u0441\u044f \u0432 \u0431\u0430\u0439\u0442-\u043a\u043e\u0434\u0435.<\/p>\n<p>  \u0422\u0430\u043a \u043f\u043e\u0447\u0435\u043c\u0443 \u0431\u044b \u043d\u0430\u043c \u0435\u0451 \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435 \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c (\u0434\u0430, \u0438\u0437 \u0431\u0430\u0439\u0442-\u043a\u043e\u0434\u0430)? \u041d\u043e \u0437\u0434\u0435\u0441\u044c \u044f \u043d\u0435 \u0431\u0443\u0434\u0443 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 \u0434\u043b\u044f \u0435\u0451 \u0447\u0442\u0435\u043d\u0438\u044f \u0438\u0437 \u0431\u0430\u0439\u0442-\u043a\u043e\u0434\u0430, \u0442\u0430\u043a \u043a\u0430\u043a \u044d\u0442\u043e \u0437\u0430\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u0435\u0442 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438. \u0412\u043f\u0440\u043e\u0447\u0435\u043c, \u0432\u044b \u0441\u0430\u043c\u0438 \u043c\u043e\u0436\u0435\u0442\u0435 \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u2014 \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u043b\u0438\u0447\u043d\u043e\u0439 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u043e\u0439, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0437\u0430\u043a\u0440\u0435\u043f\u0438\u0442 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438.<\/p>\n<p>  \u0414\u043b\u044f \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u043b\u0435\u043d\u0438\u044f \u0441 \u0431\u0430\u0439\u0442-\u043a\u043e\u0434\u043e\u043c \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043d\u0430\u0447\u0430\u0442\u044c \u0441 <a href=\"https:\/\/habr.com\/ru\/post\/480550\/\">\u043c\u043e\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0438<\/a>. \u0422\u0430\u043c \u044f \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e \u0431\u0430\u0437\u043e\u0432\u044b\u0435 \u0432\u0435\u0449\u0438 \u0431\u0430\u0439\u0442-\u043a\u043e\u0434\u0430 \u0441 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043e\u0439 Hello World! \u0421\u0442\u0430\u0442\u044c\u044f \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043b\u0435\u0437\u043d\u0430, \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u0432\u044b \u043d\u0435 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0435\u0441\u044c \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0431\u0430\u0439\u0442-\u043a\u043e\u0434\u043e\u043c. \u0412 \u043d\u0435\u043c \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u043c\u043e\u043c\u0435\u043d\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u043c\u043e\u0433\u0443\u0442 \u043e\u0442\u0432\u0435\u0442\u0438\u0442\u044c \u043d\u0430 \u0432\u043e\u043f\u0440\u043e\u0441: \u043f\u043e\u0447\u0435\u043c\u0443 \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u0430\u043a?<\/p>\n<p>  \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0434\u043e\u0431\u0440\u043e \u043f\u043e\u0436\u0430\u043b\u043e\u0432\u0430\u0442\u044c \u043d\u0430 <a href=\"https:\/\/docs.oracle.com\/javase\/specs\/jvms\/se8\/jvms8.pdf\">\u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044e JVM<\/a>. \u0415\u0441\u043b\u0438 \u0432\u044b \u043d\u0435 \u0445\u043e\u0442\u0438\u0442\u0435 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c \u0431\u0430\u0439\u0442-\u043a\u043e\u0434 \u0432\u0440\u0443\u0447\u043d\u0443\u044e (\u043f\u043e \u0431\u0430\u0439\u0442\u0430\u043c), \u0442\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u0432 \u0441\u0442\u043e\u0440\u043e\u043d\u0443 \u0442\u0430\u043a\u0438\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a, \u043a\u0430\u043a <a href=\"http:\/\/asm.objectweb.org\/\">ASM<\/a> \u0438 <a href=\"https:\/\/www.javassist.org\/\">Javassist<\/a>.<\/p>\n<p>  <font color=\"#09b744\"><\/p>\n<h3>Reflections<\/h3>\n<p><\/font><br \/>  Reflections \u2014 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0441 <a href=\"https:\/\/github.com\/ronmamo\/reflections\/blob\/master\/COPYING.txt\">WTFPL \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0435\u0439<\/a>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0434\u0435\u043b\u0430\u0442\u044c \u0441 \u043d\u0435\u0439 \u0432\u0441\u0451, \u0447\u0442\u043e \u0432\u044b \u0437\u0430\u0445\u043e\u0442\u0438\u0442\u0435. \u0414\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u0430\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0434\u043b\u044f \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 classpath \u0438 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u043c\u0438. \u041f\u043e\u043b\u0435\u0437\u043d\u044b\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u043e, \u0447\u0442\u043e \u043e\u043d\u0430 \u043c\u043e\u0436\u0435\u0442 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0443\u0436\u0435 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445, \u0447\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0442\u044c \u0432\u0440\u0435\u043c\u044f. \u041c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u043a\u043e\u043f\u0430\u0442\u044c\u0441\u044f \u0432\u043d\u0443\u0442\u0440\u0438 \u0438 \u043d\u0430\u0439\u0442\u0438 \u043a\u043b\u0430\u0441\u0441 Store.<\/p>\n<pre><code class=\"java\">package com.apploidxxx.examples;  import org.reflections.Reflections;  import java.lang.reflect.InvocationTargetException; import java.util.Optional; import java.util.Set;  public class ExampleReflections {     private static final Home HOME = new Home();      public static void main(String[] args) {              Reflections reflections = new Reflections(&quot;com.apploidxxx.examples&quot;);              Set&lt;Class&lt;?&gt;&gt; superCats = reflections           .getTypesAnnotatedWith(SuperCat.class);              for (Class&lt;?&gt; clazz : superCats) {             toCat(clazz).ifPresent(Cat::meow);         }     }          private static Optional&lt;Cat&gt; toCat(Class&lt;?&gt; clazz) {         try {             return Optional.of((Cat) clazz                                .getDeclaredConstructor(Home.class)                                .newInstance(HOME)                               );         } catch (InstantiationException |                   IllegalAccessException |                   InvocationTargetException |                   NoSuchMethodException e)          {             e.printStackTrace();             return Optional.empty();         }     } }<\/code><\/pre>\n<p>  <font color=\"#09b744\"><\/p>\n<h3>spring-context<\/h3>\n<p><\/font><br \/>  \u042f \u0431\u044b \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u043e\u0432\u0430\u043b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 Reflections, \u0442\u0430\u043a \u043a\u0430\u043a \u0432\u043d\u0443\u0442\u0440\u0438 \u043e\u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0447\u0435\u0440\u0435\u0437 javassist, \u0447\u0442\u043e \u0441\u0432\u0438\u0434\u0435\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u0443\u0435\u0442 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0447\u0442\u0435\u043d\u0438\u0435 \u0431\u0430\u0439\u0442-\u043a\u043e\u0434\u0430, \u0430 \u043d\u0435 \u0435\u0433\u043e \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430.<\/p>\n<p>  \u0422\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0434\u0440\u0443\u0433\u0438\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a, \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0445 \u0441\u0445\u043e\u0436\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c. \u0418\u0445 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043c\u043d\u043e\u0433\u043e, \u043d\u043e \u0441\u0435\u0439\u0447\u0430\u0441 \u044f \u0445\u043e\u0447\u0443 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c \u043b\u0438\u0448\u044c \u043e\u0434\u0438\u043d \u0438\u0437 \u043d\u0438\u0445 \u2014 \u044d\u0442\u043e <code>spring-context<\/code>. \u041e\u043d, \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c, \u043b\u0443\u0447\u0448\u0435 \u043f\u0435\u0440\u0432\u043e\u0433\u043e, \u043a\u043e\u0433\u0434\u0430 \u0432\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442\u0435 \u0431\u043e\u0442\u0430 \u0432 \u0441\u0440\u0435\u0434\u0435 Spring. \u041d\u043e \u0438 \u0437\u0434\u0435\u0441\u044c \u0435\u0441\u0442\u044c \u043f\u0430\u0440\u0430 \u043d\u044e\u0430\u043d\u0441\u043e\u0432.<\/p>\n<p>  \u0415\u0441\u043b\u0438 \u0432\u0430\u0448\u0438 \u043a\u043b\u0430\u0441\u0441\u044b \u2014 \u044d\u0442\u043e \u043f\u043e \u0441\u0443\u0442\u0438 managed beans, \u0442\u043e \u0435\u0441\u0442\u044c \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0435 Spring, \u0442\u043e \u0432\u0430\u043c \u043d\u0435\u0437\u0430\u0447\u0435\u043c \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e \u0438\u0445 \u0441\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c. \u0412\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u044d\u0442\u0438\u043c \u0431\u0438\u043d\u0430\u043c \u0438\u0437 \u0441\u0430\u043c\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430.<\/p>\n<p>  \u0414\u0440\u0443\u0433\u043e\u0435 \u0434\u0435\u043b\u043e \u2014 \u0435\u0441\u043b\u0438 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435, \u0447\u0442\u043e\u0431\u044b \u0432\u0430\u0448\u0438 \u043f\u043e\u043c\u0435\u0447\u0435\u043d\u043d\u044b\u0435 \u043a\u043b\u0430\u0441\u0441\u044b \u0431\u044b\u043b\u0438 \u0431\u0438\u043d\u0430\u043c\u0438, \u0442\u043e\u0433\u0434\u0430 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u0447\u0435\u0440\u0435\u0437 <code>ClassPathScanningCandidateComponentProvider<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0447\u0435\u0440\u0435\u0437 ASM.<\/p>\n<p>  \u041e\u043f\u044f\u0442\u044c \u0436\u0435, \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0440\u0435\u0434\u043a\u043e \u0432\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u0443\u0434\u0435\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u0430\u043a\u043e\u0439 \u043c\u0435\u0442\u043e\u0434, \u043d\u043e \u043a\u0430\u043a \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0435\u0433\u043e \u0441\u0442\u043e\u0438\u0442 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c.<br \/>  \u042f \u043f\u0438\u0441\u0430\u043b \u043d\u0430 \u043d\u0451\u043c \u0431\u043e\u0442\u0430 \u0434\u043b\u044f \u0412\u041a. \u0412\u043e\u0442 <a href=\"https:\/\/github.com\/AppLoidx\/java-vk-bot\">\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439<\/a>, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f, \u043d\u043e \u043f\u0438\u0441\u0430\u043b \u044f \u0435\u0433\u043e \u0434\u0430\u0432\u043d\u043e, \u0430 \u043a\u043e\u0433\u0434\u0430 \u0437\u0430\u0448\u0451\u043b \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c, \u0447\u0442\u043e\u0431\u044b \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u0443 \u0432 \u0441\u0442\u0430\u0442\u044c\u044e, \u0442\u043e \u0443\u0432\u0438\u0434\u0435\u043b, \u0447\u0442\u043e \u0447\u0435\u0440\u0435\u0437 <a href=\"https:\/\/github.com\/VKCOM\/vk-java-sdk\">VK-Java-SDK<\/a> \u044f \u043f\u043e\u043b\u0443\u0447\u0430\u044e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0441 \u043d\u0435\u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c\u0438 \u043f\u043e\u043b\u044f\u043c\u0438, \u0445\u043e\u0442\u044f \u0440\u0430\u043d\u044c\u0448\u0435 \u0432\u0441\u0451 \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e.<\/p>\n<p>  \u0421\u0430\u043c\u043e\u0435 \u0437\u0430\u0431\u0430\u0432\u043d\u043e\u0435, \u0447\u0442\u043e \u044f \u0434\u0430\u0436\u0435 \u0432\u0435\u0440\u0441\u0438\u044e SDK \u043d\u0435 \u043c\u0435\u043d\u044f\u043b, \u043f\u043e\u044d\u0442\u043e\u043c\u0443, \u0435\u0441\u043b\u0438 \u0432\u044b \u043d\u0430\u0439\u0434\u0451\u0442\u0435, \u0432 \u0447\u0435\u043c \u0431\u044b\u043b\u0430 \u043f\u0440\u0438\u0447\u0438\u043d\u0430, \u2014 \u0431\u0443\u0434\u0443 \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u0435\u043d. \u0422\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0441\u0430\u043c\u0438\u0445 \u043a\u043e\u043c\u0430\u043d\u0434 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e, \u0438 \u044d\u0442\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u043e, \u043d\u0430 \u0447\u0442\u043e \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c, \u0435\u0441\u043b\u0438 \u0445\u043e\u0442\u0438\u0442\u0435 \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u0440 \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u043e <code>spring-context<\/code>.<\/p>\n<p>  \u041a\u043e\u043c\u0430\u043d\u0434\u044b \u0432 \u043d\u0451\u043c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0438\u0437 \u0441\u0435\u0431\u044f \u0432\u043e\u0442 \u0447\u0442\u043e:<\/p>\n<pre><code class=\"java\">@Command(value = &quot;hello&quot;, aliases = {&quot;\u043f\u0440\u0438\u0432\u0435\u0442&quot;, &quot;\u0439\u043e\u0443&quot;}) public class Hello implements Executable {      public BotResponse execute(Message message) throws Exception {         return BotResponseFactoryUtil.createResponse(&quot;hello-hello&quot;,                                                       message.peerId);     } }<\/code><\/pre>\n<p>  \u041f\u0440\u0438\u043c\u0435\u0440\u044b \u043a\u043e\u0434\u0430 \u0441 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0435\u0439 <code>SuperCat<\/code> \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043d\u0430\u0439\u0442\u0438 \u0432 \u044d\u0442\u043e\u043c <a href=\"https:\/\/github.com\/AppLoidx\/java-annotation-examples\/blob\/master\/README.md\">\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438<\/a>.<\/p>\n<p>  <font color=\"#09b744\"><\/p>\n<h2>\u041f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0439 \u0432 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u0422\u0435\u043b\u0435\u0433\u0440\u0430\u043c-\u0431\u043e\u0442\u0430<\/h2>\n<p><\/font><br \/>  \u0412\u0441\u0451 \u044d\u0442\u043e \u0431\u044b\u043b\u043e \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0434\u043b\u0438\u043d\u043d\u044b\u043c, \u043d\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u043c \u0432\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u0435\u043c \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044f\u043c\u0438. \u0414\u0430\u043b\u0435\u0435, \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0431\u043e\u0442\u0430, \u043d\u043e \u0446\u0435\u043b\u044c \u0441\u0442\u0430\u0442\u044c\u0438 \u2014 \u044d\u0442\u043e \u043d\u0435 \u043c\u0430\u043d\u0443\u0430\u043b \u043a \u0435\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044e. \u042d\u0442\u043e \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0439. \u0417\u0434\u0435\u0441\u044c \u043c\u043e\u0433\u043b\u0438 \u0431\u044b\u0442\u044c \u0447\u0442\u043e \u0443\u0433\u043e\u0434\u043d\u043e: \u043e\u0442 \u043a\u043e\u043d\u0441\u043e\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0434\u043e \u044d\u0442\u0438\u0445 \u0436\u0435 \u0441\u0430\u043c\u044b\u0445 \u0431\u043e\u0442\u043e\u0432 \u0434\u043b\u044f \u0432\u043a, \u0442\u0435\u043b\u0435\u0433\u0438 \u0438 \u043f\u0440\u043e\u0447\u0435\u0433\u043e.<\/p>\n<p>  \u0422\u0430\u043a\u0436\u0435 \u0437\u0434\u0435\u0441\u044c \u043e\u0441\u043e\u0437\u043d\u0430\u043d\u043d\u043e \u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u0441\u044f \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u043e \u044d\u0442\u043e\u0433\u043e \u0432 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u0445 \u043d\u0435 \u0431\u044b\u043b\u043e \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u0447\u0435\u043a\u043e\u0432 \u043d\u0430 null \u0438\u043b\u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043e\u0448\u0438\u0431\u043e\u043a, \u043d\u0435 \u0433\u043e\u0432\u043e\u0440\u044f \u0443\u0436\u0435 \u043e\u0431 \u0438\u0445 \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438.<\/p>\n<p>  \u0412\u0441\u0435 \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u044f \u043a\u043e\u0434\u0430. \u041f\u043e\u044d\u0442\u043e\u043c\u0443, \u0435\u0441\u043b\u0438 \u0432\u044b \u0431\u0443\u0434\u0435\u0442\u0435 \u0431\u0440\u0430\u0442\u044c \u043a\u043e\u0434 \u0438\u0437 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432, \u0442\u043e \u043d\u0435 \u043b\u0435\u043d\u0438\u0442\u0435\u0441\u044c \u0434\u043e\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0435\u0433\u043e, \u0442\u0430\u043a \u0432\u044b \u043b\u0443\u0447\u0448\u0435 \u0435\u0433\u043e \u043f\u043e\u0439\u043c\u0435\u0442\u0435 \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u0435 \u043f\u043e\u0434 \u0441\u0432\u043e\u0438 \u043d\u0443\u0436\u0434\u044b.<\/p>\n<p>  \u041c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 TelegramBots \u0441 <a href=\"https:\/\/github.com\/rubenlagus\/TelegramBots\/blob\/master\/LICENSE\">MIT \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0435\u0439<\/a> \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 API \u0442\u0435\u043b\u0435\u0433\u0440\u0430\u043c\u0430. \u0412\u044b \u0436\u0435 \u043c\u043e\u0436\u0435\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043b\u044e\u0431\u0443\u044e \u0434\u0440\u0443\u0433\u0443\u044e. \u042f \u0432\u044b\u0431\u0440\u0430\u043b \u0435\u0451, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043e\u043d\u0430 \u043c\u043e\u0433\u043b\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043a\u0430\u043a \u00abc\u00bb (\u0438\u043c\u0435\u0435\u0442 \u0432\u0435\u0440\u0441\u0438\u044e \u0441\u043e \u0441\u0442\u0430\u0440\u0442\u0451\u0440\u043e\u043c), \u0442\u0430\u043a \u0438 \u00ab\u0431\u0435\u0437\u00bb \u0441\u043f\u0440\u0438\u043d\u0433-\u0431\u0443\u0442\u0430.<\/p>\n<p>  \u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u044f \u043d\u0435 \u0445\u043e\u0447\u0443 \u0442\u0430\u043a\u0436\u0435 \u0443\u0441\u043b\u043e\u0436\u043d\u044f\u0442\u044c \u043a\u043e\u0434, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044f \u043a\u0430\u043a\u0443\u044e-\u0442\u043e \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u044e, \u0435\u0441\u043b\u0438 \u0445\u043e\u0442\u0438\u0442\u0435, \u0442\u043e \u043c\u043e\u0436\u0435\u0442\u0435 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u043e\u0435, \u043d\u043e \u043f\u043e\u0434\u0443\u043c\u0430\u0439\u0442\u0435, \u0441\u0442\u043e\u0438\u0442 \u043b\u0438 \u043e\u043d\u043e \u0442\u043e\u0433\u043e, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u043b\u044f \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u043c\u044b \u0447\u0430\u0441\u0442\u043e \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0435 \u043a\u043b\u0430\u0441\u0441\u044b \u0438\u0437 \u044d\u0442\u0438\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a, \u043f\u0440\u0438\u0432\u044f\u0437\u044b\u0432\u0430\u044f \u043d\u0430\u0448 \u043a\u043e\u0434 \u043a \u043d\u0438\u043c.<\/p>\n<p>  <font color=\"#09b744\"><\/p>\n<h3>Reflections<\/h3>\n<p><\/font><br \/>  \u041f\u0435\u0440\u0432\u044b\u0439 \u0431\u043e\u0442 \u043d\u0430 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u2014 \u044d\u0442\u043e \u0431\u043e\u0442, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u043d\u0430 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 reflections, \u0431\u0435\u0437 Spring. \u0411\u0443\u0434\u0435\u043c \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c \u043d\u0435 \u0432\u0441\u0451 \u043f\u043e\u0434\u0440\u044f\u0434, \u0430 \u043b\u0438\u0448\u044c \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043c\u043e\u043c\u0435\u043d\u0442\u044b, \u0432 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u043d\u0430\u0441 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u0435\u0442 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0439. \u0414\u043e \u0440\u0430\u0437\u0431\u043e\u0440\u0430 \u0432 \u0441\u0442\u0430\u0442\u044c\u0435 \u0432\u044b \u0441\u0430\u043c\u0438 \u043c\u043e\u0436\u0435\u0442\u0435 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0432 \u0435\u0433\u043e \u0440\u0430\u0431\u043e\u0442\u0435 \u0432 <a href=\"https:\/\/github.com\/AppLoidx\/telegram-bot-sample\">\u043c\u043e\u0451\u043c \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438<\/a>.<\/p>\n<p>  \u0412\u043e \u0432\u0441\u0435\u0445 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u0445 \u0431\u0443\u0434\u0435\u043c \u043f\u0440\u0438\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0431\u043e\u0442 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043a\u043e\u043c\u0430\u043d\u0434, \u043f\u0440\u0438\u0447\u0451\u043c \u044d\u0442\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u043c\u044b \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u0432\u0440\u0443\u0447\u043d\u0443\u044e, \u0430 \u043f\u0440\u043e\u0441\u0442\u043e \u0431\u0443\u0434\u0435\u043c \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438. \u0412\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u043c\u0430\u043d\u0434\u044b:  <\/p>\n<pre><code class=\"java\">@Handler(&quot;\/hello&quot;) public class HelloHandler implements RequestHandler {      private static final Logger log = LoggerFactory       .getLogger(HelloHandler.class);          @Override     public SendMessage execute(Message message) {         log.info(&quot;Executing message from : &quot; + message.getText());         return SendMessage.builder()                 .text(&quot;Yaks&quot;)                 .chatId(String.valueOf(message.getChatId()))                 .build();     } } @Retention(RetentionPolicy.RUNTIME) public @interface Handler {     String value(); }<\/code><\/pre>\n<p>  \u0412 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 <code>\/hello<\/code> \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043f\u0438\u0441\u0430\u043d \u0432 <code>value<\/code> \u0432 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438. value \u2014 \u044d\u0442\u043e \u0447\u0442\u043e-\u0442\u043e \u0432\u0440\u043e\u0434\u0435 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e. \u0422\u043e \u0435\u0441\u0442\u044c <code>@Handler(&quot;\/hello&quot;)<\/code> = <code>@Handler(value = &quot;\/hello&quot;)<\/code>.<\/p>\n<p>  \u0422\u0430\u043a\u0436\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u043b\u043e\u0433\u0433\u0435\u0440\u044b. \u0418\u0445 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u043b\u0438\u0431\u043e \u0434\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0430, \u043b\u0438\u0431\u043e \u043f\u043e\u0441\u043b\u0435, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0445:<\/p>\n<pre><code class=\"java\">@Retention(RetentionPolicy.RUNTIME) public @interface Log {     String value() default &quot;.*&quot;;    \/\/ regex     ExecutionTime[] executionTime() default ExecutionTime.BEFORE; } default` \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u043e, \u0435\u0441\u043b\u0438 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0443\u043a\u0430\u0437\u0430\u043d `value @Log public class LogHandler implements RequestLogger {      private static final Logger log = LoggerFactory       .getLogger(LogHandler.class);          @Override     public void execute(Message message) {         log.info(&quot;Just log a received message : &quot; + message.getText());     } }<\/code><\/pre>\n<p>  \u041d\u043e \u0442\u0430\u043a\u0436\u0435 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440, \u0447\u0442\u043e\u0431\u044b \u043b\u043e\u0433\u0433\u0435\u0440 \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043b \u043f\u0440\u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0445 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f\u0445:<\/p>\n<pre><code class=\"java\">@Log(value = &quot;\/hello&quot;) public class HelloLogHandler implements RequestLogger {     public static final Logger log = LoggerFactory       .getLogger(HelloLogHandler.class);      @Override     public void execute(Message message) {         log.info(&quot;Received special hello command!&quot;);     } } <\/code><\/pre>\n<p>  \u0418\u043b\u0438 \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043b \u043f\u043e\u0441\u043b\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0430:<\/p>\n<pre><code class=\"java\">@Log(executionTime = ExecutionTime.AFTER) public class AfterLogHandler implements RequestLogger {      private static final Logger log = LoggerFactory       .getLogger(AfterLogHandler.class);          @Override     public void executeAfter(Message message, SendMessage sendMessage) {         log.info(&quot;Bot response &gt;&gt; &quot; + sendMessage.getText());     } }<\/code><\/pre>\n<p>  \u0418\u043b\u0438 \u0438 \u0442\u0430\u043c, \u0438 \u0442\u0430\u043c:<\/p>\n<pre><code class=\"java\">@Log(executionTime = {ExecutionTime.AFTER, ExecutionTime.BEFORE}) public class AfterAndBeforeLogger implements RequestLogger {     private static final Logger log = LoggerFactory       .getLogger(AfterAndBeforeLogger.class);      @Override     public void execute(Message message) {         log.info(&quot;Before execute&quot;);     }          @Override     public void executeAfter(Message message, SendMessage sendMessage) {         log.info(&quot;After execute&quot;);     } }<\/code><\/pre>\n<p>  \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0430\u043a\u043e\u0435, \u0442\u0430\u043a \u043a\u0430\u043a <code>executionTime<\/code> \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u043c\u0430\u0441\u0441\u0438\u0432 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439. \u041f\u0440\u0438\u043d\u0446\u0438\u043f \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u0440\u043e\u0441\u0442, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u043c \u043a \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u044d\u0442\u0438\u0445 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0439:<\/p>\n<pre><code class=\"java\">Set&lt;Class&lt;?&gt;&gt; annotatedCommands =    reflections.getTypesAnnotatedWith(Handler.class);  final Map&lt;String, RequestHandler&gt; commandsMap = new HashMap&lt;&gt;();  final Class&lt;RequestHandler&gt; requiredInterface = RequestHandler.class;  for (Class&lt;?&gt; clazz : annotatedCommands) {     if (LoaderUtils.isImplementedInterface(clazz, requiredInterface)) {         for (Constructor&lt;?&gt; c : clazz.getDeclaredConstructors()) {             \/\/noinspection unchecked             Constructor&lt;RequestHandler&gt; castedConstructor =                (Constructor&lt;RequestHandler&gt;) c;             commandsMap.put(extractCommandName(clazz),                              OBJECT_CREATOR.instantiateClass(castedConstructor));         }      } else {         log.warn(&quot;Command didn't implemented: &quot;                   + requiredInterface.getCanonicalName());          } }  \/\/ ... private static String extractCommandName(Class&lt;?&gt; clazz) {     Handler handler = clazz.getAnnotation(Handler.class);     if (handler == null) {         throw new            IllegalArgumentException(             &quot;Passed class without Handler annotation&quot;             );     } else {         return handler.value();     } }<\/code><\/pre>\n<p>  \u041f\u043e \u0441\u0443\u0442\u0438, \u043c\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u043c\u0430\u043f\u0443 \u0441 \u0438\u043c\u0435\u043d\u0435\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u044b, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0431\u0435\u0440\u0451\u043c \u0438\u0437 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f <code>value<\/code> \u0432 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438. \u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 <a href=\"https:\/\/github.com\/AppLoidx\/telegram-bot-sample\/blob\/master\/src\/main\/java\/com\/apploidxxx\/commander\/loader\/CommandLoader.java\">\u0437\u0434\u0435\u0441\u044c<\/a>.<\/p>\n<p>  \u0422\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435 \u0434\u0435\u043b\u0430\u0435\u043c \u0441 Log, \u0442\u043e\u043b\u044c\u043a\u043e \u043b\u043e\u0433\u0433\u0435\u0440\u043e\u0432 \u0441 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u043c\u0438 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u0430\u043c\u0438 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u0447\u0443\u0442\u044c \u043c\u0435\u043d\u044f\u0435\u043c \u043d\u0430\u0448\u0443 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0434\u0430\u043d\u043d\u044b\u0445:<\/p>\n<pre><code class=\"java\">Set&lt;Class&lt;?&gt;&gt; annotatedLoggers = reflections.getTypesAnnotatedWith(Log.class);  final Map&lt;String, Set&lt;RequestLogger&gt;&gt; commandsMap = new HashMap&lt;&gt;(); final Class&lt;RequestLogger&gt; requiredInterface = RequestLogger.class;  for (Class&lt;?&gt; clazz : annotatedLoggers) {     if (LoaderUtils.isImplementedInterface(clazz, requiredInterface)) {         for (Constructor&lt;?&gt; c : clazz.getDeclaredConstructors()) {             \/\/noinspection unchecked             Constructor&lt;RequestLogger&gt; castedConstructor =                (Constructor&lt;RequestLogger&gt;) c;             String name = extractCommandName(clazz);             commandsMap.computeIfAbsent(name, n -&gt; new HashSet&lt;&gt;());             commandsMap               .get(extractCommandName(clazz))               .add(OBJECT_CREATOR.instantiateClass(castedConstructor));          }          } else {         log.warn(&quot;Command didn't implemented: &quot;                   + requiredInterface.getCanonicalName());     } }<\/code><\/pre>\n<p>  \u041d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u0430\u0442\u0442\u0435\u0440\u043d \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043b\u043e\u0433\u0433\u0435\u0440\u043e\u0432. \u041e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u0432\u0441\u0451 \u0442\u0430\u043a \u0436\u0435.<br \/>  \u0422\u0435\u043f\u0435\u0440\u044c \u0432 \u0441\u0430\u043c\u043e\u043c \u0431\u043e\u0442\u0435 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c <code>executionTime<\/code> \u0438 \u043f\u0435\u0440\u0435\u043d\u0430\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043d\u0430 \u044d\u0442\u0438 \u043a\u043b\u0430\u0441\u0441\u044b:<\/p>\n<pre><code class=\"java\">public final class CommandService {      private static final Map&lt;String, RequestHandler&gt; commandsMap        = new HashMap&lt;&gt;();     private static final Map&lt;String, Set&lt;RequestLogger&gt;&gt; loggersMap        = new HashMap&lt;&gt;();          private CommandService() {     }          public static synchronized void init() {         initCommands();         initLoggers();     }          private static void initCommands() {         commandsMap.putAll(CommandLoader.readCommands());     }          private static void initLoggers() {         loggersMap.putAll(LogLoader.loadLoggers());     }          public static RequestHandler serve(String message) {         for (Map.Entry&lt;String, RequestHandler&gt; entry : commandsMap.entrySet()) {             if (entry.getKey().equals(message)) {                 return entry.getValue();             }         }              return msg -&gt; SendMessage.builder()                 .text(&quot;\u041a\u043e\u043c\u0430\u043d\u0434\u0430 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430&quot;)                 .chatId(String.valueOf(msg.getChatId()))                 .build();     }          public static Set&lt;RequestLogger&gt; findLoggers(       String message,        ExecutionTime executionTime     ) {         final Set&lt;RequestLogger&gt; matchedLoggers = new HashSet&lt;&gt;();         for (Map.Entry&lt;String, Set&lt;RequestLogger&gt;&gt; entry:loggersMap.entrySet()) {             for (RequestLogger logger : entry.getValue()) {                      if (containsExecutionTime(                   extractExecutionTimes(logger), executionTime                 ))                  {                     if (message.matches(entry.getKey()))                         matchedLoggers.add(logger);                 }             }              }              return matchedLoggers;     }          private static ExecutionTime[] extractExecutionTimes(RequestLogger logger) {         return logger.getClass().getAnnotation(Log.class).executionTime();     }          private static boolean containsExecutionTime(       ExecutionTime[] times,       ExecutionTime executionTime     ) {         for (ExecutionTime et : times) {             if (et == executionTime) return true;         }              return false;     }  } public class DefaultBot extends TelegramLongPollingBot {     private static final Logger log = LoggerFactory.getLogger(DefaultBot.class);      public DefaultBot() {         CommandService.init();         log.info(&quot;Bot initialized!&quot;);     }          @Override     public String getBotUsername() {         return System.getenv(&quot;BOT_NAME&quot;);     }          @Override     public String getBotToken() {         return System.getenv(&quot;BOT_TOKEN&quot;);     }          @Override     public void onUpdateReceived(Update update) {         try {             Message message = update.getMessage();             if (message != null &amp;&amp; message.hasText()) {                 \/\/ run &quot;before&quot; loggers                 CommandService                   .findLoggers(message.getText(), ExecutionTime.BEFORE)                   .forEach(logger -&gt; logger.execute(message));                      \/\/ command execution                 SendMessage response;                 this.execute(response = CommandService                              .serve(message.getText())                              .execute(message));                      \/\/ run &quot;after&quot; loggers                 CommandService                   .findLoggers(message.getText(), ExecutionTime.AFTER)                   .forEach(logger -&gt; logger.executeAfter(message, response));                  }         } catch (Exception e) {             e.printStackTrace();         }     } }<\/code><\/pre>\n<p>  \u041b\u0443\u0447\u0448\u0435 \u0432\u0441\u0435\u0433\u043e \u0443\u0437\u043d\u0430\u0442\u044c \u043a\u043e\u0434 \u0441\u0430\u043c\u043e\u043c\u0443 \u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438, \u0430 \u0435\u0449\u0451 \u043b\u0443\u0447\u0448\u0435 \u043e\u0442\u043a\u0440\u044b\u0442\u044c \u0435\u0433\u043e \u0447\u0435\u0440\u0435\u0437 IDE. \u042d\u0442\u043e\u0442 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0440\u0430\u0431\u043e\u0442\u044b \u0438 \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u043b\u0435\u043d\u0438\u044f, \u043d\u043e \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0431\u043e\u0442\u0430 \u043e\u043d \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0445\u043e\u0440\u043e\u0448.<\/p>\n<p>  \u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u043c\u0435\u0436\u0434\u0443 \u043a\u043e\u043c\u0430\u043d\u0434\u0430\u043c\u0438 \u043d\u0435 \u0445\u0432\u0430\u0442\u0430\u0435\u0442 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0438. \u0422\u043e \u0435\u0441\u0442\u044c \u0441 \u043a\u0430\u0436\u0434\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e <code>SendMessage<\/code>. \u042d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0431\u043e\u0440\u043e\u0442\u044c, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0432 \u0431\u043e\u043b\u0435\u0435 \u0432\u044b\u0441\u043e\u043a\u0438\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 <code>BotApiMethodMessage<\/code>, \u043d\u043e \u0438 \u044d\u0442\u043e \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u043d\u0435 \u0440\u0435\u0448\u0438\u0442 \u0432\u0441\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b.<\/p>\n<p>  \u0412\u043e-\u0432\u0442\u043e\u0440\u044b\u0445, \u0441\u0430\u043c\u0430 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 <code>TelegramBots<\/code>, \u043a\u0430\u043a \u043c\u043d\u0435 \u043a\u0430\u0436\u0435\u0442\u0441\u044f, \u043d\u0435 \u043e\u0441\u043e\u0431\u043e \u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0430 \u043d\u0430 \u0442\u0430\u043a\u0443\u044e \u0440\u0430\u0431\u043e\u0442\u0443 (\u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443) \u0431\u043e\u0442\u0430. \u0415\u0441\u043b\u0438 \u0436\u0435 \u0432\u044b \u0431\u0443\u0434\u0435\u0442\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0431\u043e\u0442\u0430 \u0438\u043c\u0435\u043d\u043d\u043e \u043d\u0430 \u044d\u0442\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435, \u0442\u043e \u043c\u043e\u0436\u0435\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <code>Ability Bot<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u043a\u0430\u0437\u0430\u043d \u0432 wiki \u0441\u0430\u043c\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438. \u041d\u043e \u043e\u0447\u0435\u043d\u044c \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u0443\u044e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u0441 \u0442\u0430\u043a\u043e\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043e\u0439. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u043e\u0436\u0435\u0442\u0435 \u043d\u0430\u0447\u0430\u0442\u044c \u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u044e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443!<\/p>\n<p>  <font color=\"#09b744\"><\/p>\n<h3>\u0421\u043f\u0440\u0438\u043d\u0433\u043e\u0432\u044b\u0439 \u0431\u043e\u0442<\/h3>\n<p><\/font><br \/>  \u042d\u0442\u043e \u043f\u0440\u0438\u043e\u0431\u0440\u0435\u0442\u0430\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u0441\u043c\u044b\u0441\u043b\u0430 \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u044d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u043e\u0439 \u0441\u043f\u0440\u0438\u043d\u0433\u0430:<\/p>\n<ul>\n<li>\u0420\u0430\u0431\u043e\u0442\u0430 \u0447\u0435\u0440\u0435\u0437 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438 \u043d\u0435 \u043d\u0430\u0440\u0443\u0448\u0430\u0435\u0442 \u043e\u0431\u0449\u0435\u0439 \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u0438 \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u043f\u0440\u0438\u043d\u0433-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430.<\/li>\n<li>\u041c\u044b \u043c\u043e\u0436\u0435\u043c \u043d\u0435 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0441\u0430\u043c\u0438, \u0430 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u0445 \u0438\u0437 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430, \u043f\u043e\u043c\u0435\u0442\u0438\u0432 \u043d\u0430\u0448\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u043a\u0430\u043a \u0431\u0438\u043d\u044b.<\/li>\n<li>\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043e\u0442\u043b\u0438\u0447\u043d\u044b\u0439 DI \u043e\u0442 \u0441\u043f\u0440\u0438\u043d\u0433\u0430.<\/li>\n<\/ul>\n<p>  \u0412\u043e\u043e\u0431\u0449\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u043f\u0440\u0438\u043d\u0433\u0430 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043a\u0430\u0440\u043a\u0430\u0441\u0430 \u0434\u043b\u044f \u0431\u043e\u0442\u0430 \u2014 \u044d\u0442\u043e \u0442\u0435\u043c\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u0433\u043e\u0432\u043e\u0440\u0430. \u0412\u0435\u0434\u044c \u043c\u043d\u043e\u0433\u0438\u0435 \u043c\u043e\u0433\u0443\u0442 \u043f\u043e\u0434\u0443\u043c\u0430\u0442\u044c, \u0447\u0442\u043e \u044d\u0442\u043e \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0442\u044f\u0436\u0435\u043b\u043e \u0434\u043b\u044f \u0431\u043e\u0442\u0430 (\u0445\u043e\u0442\u044f, \u0441\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e, \u043e\u043d\u0438 \u0438 \u043d\u0430 Java \u0431\u043e\u0442\u043e\u0432 \u043d\u0435 \u043f\u0438\u0448\u0443\u0442).<\/p>\n<p>  \u041d\u043e \u044f \u0434\u0443\u043c\u0430\u044e, \u0447\u0442\u043e, \u0441\u043f\u0440\u0438\u043d\u0433 \u2014 \u044d\u0442\u043e \u0445\u043e\u0440\u043e\u0448\u0430\u044f \u0441\u0440\u0435\u0434\u0430 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u044d\u043d\u0442\u0435\u0440\u043f\u0440\u0430\u0439\u0437\u0430\/\u0432\u0435\u0431-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439. \u041f\u0440\u043e\u0441\u0442\u043e \u043e\u043d \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0432 \u0441\u0435\u0431\u0435 \u043e\u0447\u0435\u043d\u044c \u043c\u043d\u043e\u0433\u043e \u043a\u0430\u043a \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0445, \u0442\u0430\u043a \u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u0434\u043b\u044f \u0441\u0432\u043e\u0435\u0439 \u044d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u044b (\u043f\u043e\u0434 \u0441\u043f\u0440\u0438\u043d\u0433\u043e\u043c \u0438\u043c\u0435\u0435\u0442\u0441\u044f \u0432 \u0432\u0438\u0434\u0443 Spring Boot).<\/p>\n<p>  \u0418, \u0441\u0430\u043c\u043e\u0435 \u0433\u043b\u0430\u0432\u043d\u043e\u0435, \u043e\u043d \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0447\u0435\u043d\u044c \u043c\u043d\u043e\u0433\u043e \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u043e\u0432 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u043c\u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u0430\u043c\u0438, \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u043c\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u043c.<\/p>\n<p>  <font color=\"#09b744\"><\/p>\n<h3>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f<\/h3>\n<p><\/font><br \/>  \u0427\u0442\u043e \u0436, \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u043c \u043a \u0441\u0430\u043c\u043e\u043c\u0443 \u0431\u043e\u0442\u0443.<\/p>\n<p>  \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043c\u044b \u043f\u0438\u0448\u0435\u043c \u043d\u0430 \u0441\u043f\u0440\u0438\u043d\u0433\u043e\u0432\u043e\u043c \u0441\u0442\u0435\u043a\u0435, \u0442\u043e \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043d\u0435 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u043a\u043e\u043c\u0430\u043d\u0434, \u0430 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c \u0432 \u0441\u043f\u0440\u0438\u043d\u0433\u0435. \u0418\u0445 \u043c\u043e\u0436\u043d\u043e \u043d\u0435 \u0441\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0430 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u0437 <a href=\"https:\/\/docs.spring.io\/spring-framework\/docs\/current\/reference\/html\/core.html#beans\">IoC \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430<\/a>.<\/p>\n<p>  \u0411\u043e\u043b\u0435\u0435 \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u043c\u043e\u0433\u0443\u0442 \u0441\u0440\u0430\u0437\u0443 \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u0442\u044c \u043a <a href=\"https:\/\/github.com\/AppLoidx\/Meet-Bot\">\u0447\u0442\u0435\u043d\u0438\u044e \u043a\u043e\u0434\u0430<\/a>.<\/p>\n<p>  \u0417\u0434\u0435\u0441\u044c \u0436\u0435 \u044f \u0440\u0430\u0437\u0431\u0435\u0440\u0443 \u0438\u043c\u0435\u043d\u043d\u043e \u0447\u0442\u0435\u043d\u0438\u0435 \u043a\u043e\u043c\u0430\u043d\u0434, \u0445\u043e\u0442\u044f \u0432 \u0441\u0430\u043c\u043e\u043c \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 \u0435\u0441\u0442\u044c \u0435\u0449\u0451 \u043f\u0430\u0440\u0430 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0445 \u043c\u043e\u043c\u0435\u043d\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e.<br \/>  \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u0445\u043e\u0436\u0430 \u043d\u0430 \u0431\u043e\u0442\u0430 \u0447\u0435\u0440\u0435\u0437 Reflections, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438 \u0442\u0435 \u0436\u0435.<\/p>\n<p>  <a href=\"https:\/\/github.com\/AppLoidx\/Meet-Bot\/blob\/master\/src\/main\/java\/com\/art\/meetbot\/bot\/core\/loader\/ObjectLoader.java\">ObjectLoader.java<\/a><\/p>\n<pre><code class=\"java\">@Service public class ObjectLoader {     private final ApplicationContext applicationContext;      public ObjectLoader(ApplicationContext applicationContext) {         this.applicationContext = applicationContext;     }          public Collection&lt;Object&gt; loadObjectsWithAnnotation(       Class&lt;? extends Annotation&gt; annotation     ) {         return applicationContext.getBeansWithAnnotation(annotation).values();     } }<\/code><\/pre>\n<p>  <a href=\"https:\/\/github.com\/AppLoidx\/Meet-Bot\/blob\/master\/src\/main\/java\/com\/art\/meetbot\/bot\/core\/loader\/CommandLoader.java\">CommandLoader.java<\/a><\/p>\n<pre><code class=\"plaintext\">public Map&lt;String, RequestHandler&gt; readCommands() {      final Map&lt;String, RequestHandler&gt; commandsMap = new HashMap&lt;&gt;();          for (Object obj : objectLoader.loadObjectsWithAnnotation(Handler.class)) {         if (obj instanceof RequestHandler) {             RequestHandler handler = (RequestHandler) obj;             commandsMap.put(extractCommandName(handler.getClass()), handler);         }     }          return commandsMap; }<\/code><\/pre>\n<p>  \u0412 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 \u043f\u0440\u043e\u0448\u043b\u043e\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0437\u0434\u0435\u0441\u044c \u0443\u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0431\u043e\u043b\u0435\u0435 \u0432\u044b\u0441\u043e\u043a\u0438\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0438 \u0434\u043b\u044f \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432, \u0447\u0442\u043e, \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435, \u0445\u043e\u0440\u043e\u0448\u043e. \u0422\u0430\u043a\u0436\u0435 \u043d\u0430\u043c \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0441\u0430\u043c\u0438\u043c \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u044b \u043a\u043e\u043c\u0430\u043d\u0434.<\/p>\n<p>  <font color=\"#09b744\"><\/p>\n<h2>\u041f\u043e\u0434\u0432\u0435\u0434\u0451\u043c \u0438\u0442\u043e\u0433\u0438<\/h2>\n<p><\/font><br \/>  \u0422\u043e\u043b\u044c\u043a\u043e \u0432\u0430\u043c \u0440\u0435\u0448\u0430\u0442\u044c, \u0447\u0442\u043e \u043b\u0443\u0447\u0448\u0435 \u043f\u043e\u0434\u043e\u0439\u0434\u0451\u0442 \u043f\u043e\u0434 \u0432\u0430\u0448\u0443 \u0437\u0430\u0434\u0430\u0447\u0443. \u042f \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043b \u0443\u0441\u043b\u043e\u0432\u043d\u043e \u0442\u0440\u0438 \u0441\u043b\u0443\u0447\u0430\u044f \u0434\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u043f\u043e\u0445\u043e\u0436\u0438\u0445 \u0431\u043e\u0442\u043e\u0432:<\/p>\n<ul>\n<li>Reflections.<\/li>\n<li>Spring-Context (\u0431\u0435\u0437 Spring).<\/li>\n<li>ApplicationContext \u0438\u0437 Spring.<\/li>\n<\/ul>\n<p>  \u0422\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435 \u044f \u043c\u043e\u0433\u0443 \u0434\u0430\u0442\u044c \u0432\u0430\u043c \u0441\u043e\u0432\u0435\u0442, \u043e\u0441\u043d\u043e\u0432\u044b\u0432\u0430\u044f\u0441\u044c \u043d\u0430\u00a0 \u0441\u0432\u043e\u0451\u043c \u043e\u043f\u044b\u0442\u0435:<\/p>\n<ol>\n<li>\u041f\u043e\u0434\u0443\u043c\u0430\u0439\u0442\u0435, \u043d\u0443\u0436\u0435\u043d \u043b\u0438 \u0432\u0430\u043c Spring. \u041e\u043d \u0434\u0430\u0451\u0442 \u043c\u043e\u0449\u043d\u044b\u0439 IoC \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u044d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u044b, \u043d\u043e \u0437\u0430 \u0432\u0441\u0451 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u043b\u0430\u0442\u0438\u0442\u044c. \u041e\u0431\u044b\u0447\u043d\u043e \u044f \u0440\u0430\u0441\u0441\u0443\u0436\u0434\u0430\u044e \u0442\u0430\u043a: \u0435\u0441\u043b\u0438 \u043d\u0443\u0436\u043d\u044b \u0431\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0431\u044b\u0441\u0442\u0440\u044b\u0439 \u0441\u0442\u0430\u0440\u0442, \u0442\u043e Spring Boot \u0432\u0430\u043c \u043d\u0443\u0436\u0435\u043d. \u0415\u0441\u043b\u0438 \u0436\u0435 \u0431\u043e\u0442 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442, \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043e\u0431\u043e\u0439\u0442\u0438\u0441\u044c \u0438 \u0431\u0435\u0437 \u043d\u0435\u0433\u043e.<\/li>\n<li>\u0415\u0441\u043b\u0438 \u0436\u0435 \u0432\u0430\u043c \u043d\u0435 \u043d\u0443\u0436\u043d\u044b \u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438, \u0442\u043e \u0441\u043c\u0435\u043b\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 Reflections.<\/li>\n<\/ol>\n<p>  \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, JPA \u0431\u0435\u0437 Spring Data \u043c\u043d\u0435 \u043a\u0430\u0436\u0435\u0442\u0441\u044f \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0442\u0440\u0443\u0434\u043e\u0451\u043c\u043a\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0435\u0439, \u0445\u043e\u0442\u044f \u0432\u044b \u0442\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u044b \u0432 \u0432\u0438\u0434\u0435 micronaut \u0438\u043b\u0438 quarkus, \u043d\u043e \u043e \u043d\u0438\u0445 \u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u0441\u043b\u044b\u0448\u0430\u043d \u0438 \u043d\u0435 \u0438\u043c\u0435\u044e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e\u0433\u043e \u043e\u043f\u044b\u0442\u0430, \u0447\u0442\u043e\u0431\u044b \u0447\u0442\u043e-\u0442\u043e \u0441\u043e\u0432\u0435\u0442\u043e\u0432\u0430\u0442\u044c \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u044d\u0442\u043e\u0433\u043e.<\/p>\n<p>  \u0415\u0441\u043b\u0438 \u0432\u044b \u043f\u0440\u0438\u0432\u0435\u0440\u0436\u0435\u043d\u0435\u0446 \u0431\u043e\u043b\u0435\u0435 \u0447\u0438\u0441\u0442\u043e\u0433\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0430 \u0441 \u043d\u0443\u043b\u044f \u0434\u0430\u0436\u0435 \u0431\u0435\u0437 JPA, \u0442\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u043d\u0430 <a href=\"https:\/\/github.com\/AppLoidx\/JavaBot\">\u044d\u0442\u043e\u0433\u043e<\/a> \u0431\u043e\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0447\u0435\u0440\u0435\u0437 JDBC \u0447\u0435\u0440\u0435\u0437 \u0412\u041a \u0438 \u0422\u0435\u043b\u0435\u0433\u0440\u0430\u043c.<\/p>\n<p>  \u0422\u0430\u043c \u0432\u044b \u0443\u0432\u0438\u0434\u0438\u0442\u0435 \u043c\u043d\u043e\u0433\u043e \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u0432\u0438\u0434\u0430:<\/p>\n<pre><code class=\"java\">PreparedStatement stmt = connection.prepareStatement(&quot;UPDATE alias SET aliases=?::jsonb WHERE vkid=?&quot;); stmt.setString(1, aliases.toJSON()); stmt.setInt(2, vkid); stmt.execute();<\/code><\/pre>\n<p>  \u041d\u043e \u043a\u043e\u0434 \u0438\u043c\u0435\u0435\u0442 \u0434\u0432\u0443\u0445\u0433\u043e\u0434\u0438\u0447\u043d\u0443\u044e \u0434\u0430\u0432\u043d\u043e\u0441\u0442\u044c, \u0442\u0430\u043a \u0447\u0442\u043e \u043d\u0435 \u0441\u043e\u0432\u0435\u0442\u0443\u044e \u043e\u0442\u0442\u0443\u0434\u0430 \u0431\u0440\u0430\u0442\u044c \u0432\u0441\u0435 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u044b. \u0418 \u0432\u043e\u043e\u0431\u0449\u0435 \u044f \u0431\u044b \u043d\u0435 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u043e\u0432\u0430\u043b \u0442\u0430\u043a\u0438\u043c \u0437\u0430\u043d\u0438\u043c\u0430\u0442\u044c\u0441\u044f \u0432\u043e\u0432\u0441\u0435 (\u0440\u0430\u0431\u043e\u0442\u0443 \u0447\u0435\u0440\u0435\u0437 JDBC).<\/p>\n<p>  \u0422\u0430\u043a\u0436\u0435 \u043b\u0438\u0447\u043d\u043e \u043c\u043d\u0435 \u043d\u0435 \u043e\u0441\u043e\u0431\u043e \u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0441 Hibernate. \u042f \u0443\u0436\u0435 \u0438\u043c\u0435\u043b \u043f\u0435\u0447\u0430\u043b\u044c\u043d\u044b\u0439 \u043e\u043f\u044b\u0442 \u043f\u0438\u0441\u0430\u0442\u044c <code>DAO<\/code> \u0438 <code>HibernateSessionFactoryUtil<\/code> (\u0442\u0435, \u043a\u0442\u043e \u043f\u0438\u0441\u0430\u043b, \u043f\u043e\u0439\u043c\u0443\u0442, \u043e \u0447\u0451\u043c \u044f).<\/p>\n<p>  \u0427\u0442\u043e \u043a\u0430\u0441\u0430\u0435\u0442\u0441\u044f \u0441\u0430\u043c\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438, \u044f \u043f\u044b\u0442\u0430\u043b\u0441\u044f \u043f\u0438\u0441\u0430\u0442\u044c \u043a\u0440\u0430\u0442\u043a\u043e, \u043d\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e, \u0447\u0442\u043e\u0431\u044b, \u0438\u043c\u0435\u044f \u0432 \u0440\u0443\u043a\u0430\u0445 \u0442\u043e\u043b\u044c\u043a\u043e \u044d\u0442\u0443 \u0441\u0442\u0430\u0442\u044c\u044e, \u0432\u044b \u043c\u043e\u0433\u043b\u0438 \u043d\u0430\u0447\u0430\u0442\u044c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443. \u0412\u0441\u0451-\u0442\u0430\u043a\u0438 \u044d\u0442\u043e \u043d\u0435 \u0433\u043b\u0430\u0432\u0430 \u0432 \u043a\u043d\u0438\u0433\u0435, \u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u043d\u0430 \u0425\u0430\u0431\u0440\u0435. \u0413\u043b\u0443\u0431\u0436\u0435 \u0438\u0437\u0443\u0447\u0438\u0442\u044c \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438 \u0438 \u0432\u043e\u043e\u0431\u0449\u0435 \u0440\u0435\u0444\u043b\u0435\u043a\u0441\u0438\u044e \u0432\u044b \u0441\u043c\u043e\u0436\u0435\u0442\u0435 \u0441\u0430\u043c\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u044f \u0442\u043e\u0433\u043e \u0436\u0435 \u0431\u043e\u0442\u0430. <\/p>\n<p>  \u0412\u0441\u0435\u043c \u0443\u0434\u0430\u0447\u0438! \u0418 \u043d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u0439\u0442\u0435 \u043e \u043f\u0440\u043e\u043c\u043e\u043a\u043e\u0434\u0435 HABR, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u0430\u0435\u0442 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u0441\u043a\u0438\u0434\u043a\u0443 10% \u043a \u0442\u043e\u0439, \u0447\u0442\u043e \u0443\u043a\u0430\u0437\u0430\u043d\u0430 \u043d\u0430 \u0431\u0430\u043d\u043d\u0435\u0440\u0435.<\/p>\n<p>  <a href=\"https:\/\/skillfactory.ru\/?utm_source=infopartners&amp;utm_medium=habr&amp;utm_campaign=habr_banner&amp;utm_term=regular&amp;utm_content=habr_banner\"><\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/vv\/rn\/9d\/vvrn9dj4mojbpnjalnychbqpogw.png\" alt=\"image\"><\/div>\n<p><\/a><\/p>\n<ul>\n<li><a href=\"https:\/\/skillfactory.ru\/java?utm_source=infopartners&amp;utm_medium=habr&amp;utm_campaign=habr_JAVA&amp;utm_term=regular&amp;utm_content=161220\">\u041f\u0440\u043e\u0444\u0435\u0441\u0441\u0438\u044f Java-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a<\/a><\/li>\n<\/ul>\n<p>  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u0414\u0440\u0443\u0433\u0438\u0435 \u043f\u0440\u043e\u0444\u0435\u0441\u0441\u0438\u0438 \u0438 \u043a\u0443\u0440\u0441\u044b<\/b>                         <\/p>\n<div class=\"spoiler_text\"><strong>\u041f\u0420\u041e\u0424\u0415\u0421\u0421\u0418\u0418<\/strong><\/p>\n<ul>\n<li><a href=\"https:\/\/skillfactory.ru\/dstpro?utm_source=infopartners&amp;utm_medium=habr&amp;utm_campaign=habr_DSPR&amp;utm_term=regular&amp;utm_content=161220\">\u041e\u0431\u0443\u0447\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0444\u0435\u0441\u0441\u0438\u0438 Data Science<\/a><\/li>\n<li><a href=\"https:\/\/skillfactory.ru\/dataanalystpro?utm_source=infopartners&amp;utm_medium=habr&amp;utm_campaign=habr_DAPR&amp;utm_term=regular&amp;utm_content=161220\">\u041e\u0431\u0443\u0447\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0444\u0435\u0441\u0441\u0438\u0438 Data Analyst<\/a><\/li>\n<li><a href=\"https:\/\/skillfactory.ru\/webdev?utm_source=infopartners&amp;utm_medium=habr&amp;utm_campaign=habr_WEBDEV&amp;utm_term=regular&amp;utm_content=161220\">\u041f\u0440\u043e\u0444\u0435\u0441\u0441\u0438\u044f \u0412\u0435\u0431-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a<\/a><\/li>\n<li><a href=\"https:\/\/skillfactory.ru\/frontend?utm_source=infopartners&amp;utm_medium=habr&amp;utm_campaign=habr_FR&amp;utm_term=regular&amp;utm_content=161220\">\u041f\u0440\u043e\u0444\u0435\u0441\u0441\u0438\u044f Frontend-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a<\/a><\/li>\n<li><a href=\"https:\/\/skillfactory.ru\/cybersecurity?utm_source=infopartners&amp;utm_medium=habr&amp;utm_campaign=habr_HACKER&amp;utm_term=regular&amp;utm_content=161220\">\u041f\u0440\u043e\u0444\u0435\u0441\u0441\u0438\u044f \u042d\u0442\u0438\u0447\u043d\u044b\u0439 \u0445\u0430\u043a\u0435\u0440<\/a><\/li>\n<li><a href=\"https:\/\/skillfactory.ru\/cplus?utm_source=infopartners&amp;utm_medium=habr&amp;utm_campaign=habr_CPLUS&amp;utm_term=regular&amp;utm_content=161220\">\u041f\u0440\u043e\u0444\u0435\u0441\u0441\u0438\u044f C++ \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a<\/a><\/li>\n<li><a href=\"https:\/\/skillfactory.ru\/game-dev?utm_source=infopartners&amp;utm_medium=habr&amp;utm_campaign=habr_GAMEDEV&amp;utm_term=regular&amp;utm_content=161220\">\u041f\u0440\u043e\u0444\u0435\u0441\u0441\u0438\u044f \u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0438\u0433\u0440 \u043d\u0430 Unity<\/a><\/li>\n<li><a href=\"https:\/\/skillfactory.ru\/iosdev?utm_source=infopartners&amp;utm_medium=habr&amp;utm_campaign=habr_IOSDEV&amp;utm_term=regular&amp;utm_content=161220\">\u041f\u0440\u043e\u0444\u0435\u0441\u0441\u0438\u044f iOS-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0441 \u043d\u0443\u043b\u044f<\/a><\/li>\n<li><a href=\"https:\/\/skillfactory.ru\/android?utm_source=infopartners&amp;utm_medium=habr&amp;utm_campaign=habr_ANDR&amp;utm_term=regular&amp;utm_content=161220\">\u041f\u0440\u043e\u0444\u0435\u0441\u0441\u0438\u044f Android-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0441 \u043d\u0443\u043b\u044f<\/a><\/li>\n<\/ul>\n<p>  <\/p>\n<hr>\n<p>  <strong>\u041a\u0423\u0420\u0421\u042b<\/strong><\/p>\n<ul>\n<li><a href=\"https:\/\/skillfactory.ru\/python-for-web-developers?utm_source=infopartners&amp;utm_medium=habr&amp;utm_campaign=habr_PWS&amp;utm_term=regular&amp;utm_content=161220\">\u041a\u0443\u0440\u0441 \u00abPython \u0434\u043b\u044f \u0432\u0435\u0431-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438\u00bb<\/a><\/li>\n<li><a href=\"https:\/\/skillfactory.ru\/ml-and-dl?utm_source=infopartners&amp;utm_medium=habr&amp;utm_campaign=habr_MLDL&amp;utm_term=regular&amp;utm_content=161220\">\u041f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u044b\u0439 \u043a\u0443\u0440\u0441 \u00abMachine Learning Pro + Deep Learning\u00bb<\/a><\/li>\n<li><a href=\"https:\/\/skillfactory.ru\/ml-programma-machine-learning-online?utm_source=infopartners&amp;utm_medium=habr&amp;utm_campaign=habr_ML&amp;utm_term=regular&amp;utm_content=161220\">\u041a\u0443\u0440\u0441 \u043f\u043e Machine Learning<\/a><\/li>\n<li><a href=\"https:\/\/skillfactory.ru\/math_and_ml?utm_source=infopartners&amp;utm_medium=habr&amp;utm_campaign=habr_MATML&amp;utm_term=regular&amp;utm_content=161220\">\u041a\u0443\u0440\u0441 \u00ab\u041c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0430 \u0438 Machine Learning \u0434\u043b\u044f Data Science\u00bb<\/a><\/li>\n<li><a href=\"https:\/\/skillfactory.ru\/javascript?utm_source=infopartners&amp;utm_medium=habr&amp;utm_campaign=habr_FJS&amp;utm_term=regular&amp;utm_content=161220\">\u041a\u0443\u0440\u0441 \u043f\u043e JavaScript<\/a><\/li>\n<li><a href=\"https:\/\/skillfactory.ru\/analytics?utm_source=infopartners&amp;utm_medium=habr&amp;utm_campaign=habr_SDA&amp;utm_term=regular&amp;utm_content=161220\">\u041a\u0443\u0440\u0441 \u043f\u043e \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0435 \u0434\u0430\u043d\u043d\u044b\u0445<\/a><\/li>\n<li><a href=\"https:\/\/skillfactory.ru\/devops?utm_source=infopartners&amp;utm_medium=habr&amp;utm_campaign=habr_DEVOPS&amp;utm_term=regular&amp;utm_content=161220\">\u041a\u0443\u0440\u0441 \u043f\u043e DevOps<\/a><\/li>\n<\/ul>\n<p>  <\/div>\n<\/p><\/div>\n<\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/company\/skillfactory\/blog\/533478\/\"> https:\/\/habr.com\/ru\/company\/skillfactory\/blog\/533478\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\">\u0420\u0435\u0444\u043b\u0435\u043a\u0441\u0438\u044f \u0432 Java \u2014 \u044d\u0442\u043e \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0435 API \u0438\u0437 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f.<\/p>\n<p>  \u0411\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c \u0442\u0430\u043a \u0438\u043b\u0438 \u0438\u043d\u0430\u0447\u0435 \u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0440\u0435\u0444\u043b\u0435\u043a\u0441\u0438\u0435\u0439 \u0432 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0435\u0433\u043e \u0432\u0438\u0434\u0430\u0445, \u0432\u0435\u0434\u044c \u0435\u0433\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0442\u0440\u0443\u0434\u043d\u043e \u0443\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435.<\/p>\n<p>  \u041c\u043d\u043e\u0433\u0438\u0435 \u043e\u0442\u0432\u0435\u0442\u044b \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u043d\u0430 \u044d\u0442\u043e\u043c, \u043d\u043e \u0447\u0442\u043e \u0431\u043e\u043b\u0435\u0435 \u0432\u0430\u0436\u043d\u043e, \u044d\u0442\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u0432\u043e\u043e\u0431\u0449\u0435 \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u0438 \u0440\u0435\u0444\u043b\u0435\u043a\u0441\u0438\u0438. \u041c\u044b \u0433\u043e\u043d\u0438\u043c\u0441\u044f \u0437\u0430 \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u043c\u0438 \u043e\u0442\u0432\u0435\u0442\u0430\u043c\u0438 \u043d\u0430 \u0432\u043e\u043f\u0440\u043e\u0441\u044b, \u0447\u0442\u043e\u0431\u044b \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u043f\u0440\u043e\u0439\u0442\u0438 \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435, \u043d\u043e \u043d\u0435 \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u043c \u043e\u0441\u043d\u043e\u0432\u044b \u2014 \u043e\u0442\u043a\u0443\u0434\u0430 \u044d\u0442\u043e \u0432\u0437\u044f\u043b\u043e\u0441\u044c \u0438 \u0447\u0442\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c \u043f\u043e\u0434 \u0440\u0435\u0444\u043b\u0435\u043a\u0441\u0438\u0435\u0439.<\/p>\n<p>  \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u043a\u043e\u0441\u043d\u0435\u043c\u0441\u044f \u0432\u0441\u0435\u0445 \u044d\u0442\u0438\u0445 \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043a \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044f\u043c \u0438 \u043d\u0430 \u0436\u0438\u0432\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0443\u0432\u0438\u0434\u0438\u043c \u043a\u0430\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c, \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c \u0438 \u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u044e.<\/p>\n<p>  <a href=\"https:\/\/habr.com\/ru\/company\/skillfactory\/blog\/533478\/\"><\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/vt\/ft\/8q\/vtft8qmh5jun98oizgt1wkuctli.jpeg\"><\/div>\n<p><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-315055","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/315055","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=315055"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/315055\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=315055"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=315055"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=315055"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}