рдЬрд╛рд╡рд╛ 7 рдореЗрдВ рджрд╛ рд╡рд┐рдВрдЪреА рдорд╢реАрди рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдФрд░ рд╕рд╛рдЗрдХрд┐рд▓ рдХреЗ рдЦрд┐рд▓рд╛рдл рд▓рдбрд╝рд╛рдИ

рд╢реБрдн рджреЛрдкрд╣рд░, рдкреНрд░рд┐рдп harazhiteli!

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

рдпрд╣ рдЬреНрдЮрд╛рдд рд╣реИ рдХрд┐ рдЬрд╛рд╡рд╛ рдореЗрдВ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреМрди рд╕реЗ рдЕрддрд┐рднрд╛рд░рд┐рдд рддрд░реАрдХреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд┐рд░реНрдгрдп рд╕рдВрдХрд▓рди рдЪрд░рдг рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЬреИрд╕рд╛ рдХрд┐ рд╡рд┐рд░реЛрдз рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╕реА #, рдЬрд╣рд╛рдВ рдпрд╣ рд░рдирдЯрд╛рдЗрдо рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)ред рдорд╛рди рд▓реЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рд╣реИрдВ:
class A { } class B extends A { } public class Test { public void call(A a) { System. out .println( "A" ); } public void call(B b) { System. out .println( "B" ); } public static void main( String [] argv) { A b = new B(); Test test = new Test(); test.call(b); } } * This source code was highlighted with Source Code Highlighter .
  1. class A { } class B extends A { } public class Test { public void call(A a) { System. out .println( "A" ); } public void call(B b) { System. out .println( "B" ); } public static void main( String [] argv) { A b = new B(); Test test = new Test(); test.call(b); } } * This source code was highlighted with Source Code Highlighter .
  2. class A { } class B extends A { } public class Test { public void call(A a) { System. out .println( "A" ); } public void call(B b) { System. out .println( "B" ); } public static void main( String [] argv) { A b = new B(); Test test = new Test(); test.call(b); } } * This source code was highlighted with Source Code Highlighter .
  3. class A { } class B extends A { } public class Test { public void call(A a) { System. out .println( "A" ); } public void call(B b) { System. out .println( "B" ); } public static void main( String [] argv) { A b = new B(); Test test = new Test(); test.call(b); } } * This source code was highlighted with Source Code Highlighter .
  4. class A { } class B extends A { } public class Test { public void call(A a) { System. out .println( "A" ); } public void call(B b) { System. out .println( "B" ); } public static void main( String [] argv) { A b = new B(); Test test = new Test(); test.call(b); } } * This source code was highlighted with Source Code Highlighter .
  5. class A { } class B extends A { } public class Test { public void call(A a) { System. out .println( "A" ); } public void call(B b) { System. out .println( "B" ); } public static void main( String [] argv) { A b = new B(); Test test = new Test(); test.call(b); } } * This source code was highlighted with Source Code Highlighter .
  6. class A { } class B extends A { } public class Test { public void call(A a) { System. out .println( "A" ); } public void call(B b) { System. out .println( "B" ); } public static void main( String [] argv) { A b = new B(); Test test = new Test(); test.call(b); } } * This source code was highlighted with Source Code Highlighter .
  7. class A { } class B extends A { } public class Test { public void call(A a) { System. out .println( "A" ); } public void call(B b) { System. out .println( "B" ); } public static void main( String [] argv) { A b = new B(); Test test = new Test(); test.call(b); } } * This source code was highlighted with Source Code Highlighter .
  8. class A { } class B extends A { } public class Test { public void call(A a) { System. out .println( "A" ); } public void call(B b) { System. out .println( "B" ); } public static void main( String [] argv) { A b = new B(); Test test = new Test(); test.call(b); } } * This source code was highlighted with Source Code Highlighter .
  9. class A { } class B extends A { } public class Test { public void call(A a) { System. out .println( "A" ); } public void call(B b) { System. out .println( "B" ); } public static void main( String [] argv) { A b = new B(); Test test = new Test(); test.call(b); } } * This source code was highlighted with Source Code Highlighter .
  10. class A { } class B extends A { } public class Test { public void call(A a) { System. out .println( "A" ); } public void call(B b) { System. out .println( "B" ); } public static void main( String [] argv) { A b = new B(); Test test = new Test(); test.call(b); } } * This source code was highlighted with Source Code Highlighter .
  11. class A { } class B extends A { } public class Test { public void call(A a) { System. out .println( "A" ); } public void call(B b) { System. out .println( "B" ); } public static void main( String [] argv) { A b = new B(); Test test = new Test(); test.call(b); } } * This source code was highlighted with Source Code Highlighter .
  12. class A { } class B extends A { } public class Test { public void call(A a) { System. out .println( "A" ); } public void call(B b) { System. out .println( "B" ); } public static void main( String [] argv) { A b = new B(); Test test = new Test(); test.call(b); } } * This source code was highlighted with Source Code Highlighter .
  13. class A { } class B extends A { } public class Test { public void call(A a) { System. out .println( "A" ); } public void call(B b) { System. out .println( "B" ); } public static void main( String [] argv) { A b = new B(); Test test = new Test(); test.call(b); } } * This source code was highlighted with Source Code Highlighter .
  14. class A { } class B extends A { } public class Test { public void call(A a) { System. out .println( "A" ); } public void call(B b) { System. out .println( "B" ); } public static void main( String [] argv) { A b = new B(); Test test = new Test(); test.call(b); } } * This source code was highlighted with Source Code Highlighter .
  15. class A { } class B extends A { } public class Test { public void call(A a) { System. out .println( "A" ); } public void call(B b) { System. out .println( "B" ); } public static void main( String [] argv) { A b = new B(); Test test = new Test(); test.call(b); } } * This source code was highlighted with Source Code Highlighter .
  16. class A { } class B extends A { } public class Test { public void call(A a) { System. out .println( "A" ); } public void call(B b) { System. out .println( "B" ); } public static void main( String [] argv) { A b = new B(); Test test = new Test(); test.call(b); } } * This source code was highlighted with Source Code Highlighter .
  17. class A { } class B extends A { } public class Test { public void call(A a) { System. out .println( "A" ); } public void call(B b) { System. out .println( "B" ); } public static void main( String [] argv) { A b = new B(); Test test = new Test(); test.call(b); } } * This source code was highlighted with Source Code Highlighter .
class A { } class B extends A { } public class Test { public void call(A a) { System. out .println( "A" ); } public void call(B b) { System. out .println( "B" ); } public static void main( String [] argv) { A b = new B(); Test test = new Test(); test.call(b); } } * This source code was highlighted with Source Code Highlighter .

рдЬрд╛рд╡рд╛ рдирд┐рдпрдореЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░, public void call(A a) рд╡рд┐рдзрд┐ рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рддрджрдиреБрд╕рд╛рд░ "рдП" рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬреЛ рдЕрдЬреАрдм рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд╕реНрддреБ B рд╣реИ B рд╣рдореЗрдВ рдЬрд┐рд╕ рд╡рд┐рдзрд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЙрд╕реЗ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛:
  1. рдЕрдЧрд░ (рдмреА рдЗрдВрд╕реНрдЯреЛрдлрд╝ рдмреА) {
  2. test.call ((B) b);
  3. }
* рдЗрд╕ рд╕реЛрд░реНрд╕ рдХреЛрдб рдХреЛ рд╕реЛрд░реНрд╕ рдХреЛрдб рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд░ рдХреЗ рд╕рд╛рде рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред


рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рдЬреАрд╡рди рдХрд╛ рдЕрдзрд┐рдХрд╛рд░ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХрдИ рджрд░реНрдЬрди рдРрд╕реА рдХрдХреНрд╖рд╛рдПрдВ рд╣реИрдВ, рддреЛ рдХреЛрдб рдХреБрд░реВрдк рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рджреЛрд╣рд░рд╛рд╡ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИред

рдЬрд╛рд╡рд╛ 7 рдиреЗ рдЙрдкрдХрд░рдг рдкреЗрд╢ рдХрд┐рдП рдЬреЛ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрджрд┐ рднрд╛рд╖рд╛ рдХреЗ рд╕реНрддрд░ рдкрд░ рдирд╣реАрдВ, рддреЛ рдХрдо рд╕реЗ рдХрдо рдмреИрд╕рд╛рдЦреА рдХреЗ рд╕реНрддрд░ рдкрд░ рдирд╣реАрдВред рддреЛ, java.lang.invoke рдкреИрдХреЗрдЬ рд╕реЗ рдХрдХреНрд╖рд╛рдПрдВ рд╣рдорд╛рд░реА рдорджрдж рдХрд░реЗрдВрдЧреА:

рддреЛ, рд╣рдо рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рдкрд╛рд╕ рдХрд░реЗрдВрдЧреЗ - рдпрд╣ рд╕рдм рдХреИрд╕реЗ рд╣рдорд╛рд░реА рдорджрдж рдХрд░реЗрдЧрд╛ред рдЕрдм рдХреЛрдб рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:
  1. рдЖрдпрд╛рдд рд╕реНрдерд┐рд░ java.lang.invoke.MethodHandlesред *;
  2. import java.lang.invoke.MethodHandle;
  3. рдЖрдпрд╛рдд java.lang.invoke.MethodType;
  4. рдХрдХреНрд╖рд╛ рдП {
  5. }
  6. рдХреНрд▓рд╛рд╕ рдмреА рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░
  7. }
  8. рдкрдмреНрд▓рд┐рдХ рдХреНрд▓рд╛рд╕ рдЯреЗрд╕реНрдЯ {
  9. рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╢реВрдиреНрдп рдХреЙрд▓ (рдП) {
  10. рдкреНрд░рдгрд╛рд▓реАред рдмрд╛рд╣рд░ .println ( "рдП" );
  11. }
  12. рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╢реВрдиреНрдп рдХреЙрд▓ (B b) {
  13. рдкреНрд░рдгрд╛рд▓реАред рдЖрдЙрдЯ .println ( "рдмреА" );
  14. }
  15. рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╕реНрдереИрддрд┐рдХ рд╢реВрдиреНрдп рдореБрдЦреНрдп ( рд╕реНрдЯреНрд░рд┐рдВрдЧ [] argv) {
  16. рдП рдмреА = рдирдпрд╛ рдмреА ();
  17. рдкрд░реАрдХреНрд╖рдг рдкрд░реАрдХреНрд╖рдг = рдирдпрд╛ рдкрд░реАрдХреНрд╖рдг ();
  18. рдХреЛрд╢рд┐рд╢ рдХрд░реЛ {
  19. рд▓реБрдХрдЕрдк рд▓реБрдХрдЕрдк = рд▓реБрдХрдЕрдк ();
  20. MethodType mt = MethodType.methodType ( рд╢реВрдиреНрдп ; рд╡рд░реНрдЧ , b.getClass ());
  21. рдореЗрдердбрд╛рдВрдбрд▓ рдПрдордПрдЪ = рд▓реБрдХрд┐рдВрдЧ.рдлрдВрдбрд╡рд░реНрде (рдЯреЗрд╕реНрдЯред рдХреНрд▓рд╛рд╕ , "рдХреЙрд▓" , рдПрдордЯреА);
  22. mh.invokeWithArguments (рдкрд░реАрдХреНрд╖рдг, рдмреА);
  23. } рдкрдХрдбрд╝рдирд╛ (рдлреЗрдВрдХрдиреЗ рдпреЛрдЧреНрдп рдИ) {
  24. e.printStackTrace ();
  25. }
  26. }
  27. }
* рдЗрд╕ рд╕реЛрд░реНрд╕ рдХреЛрдб рдХреЛ рд╕реЛрд░реНрд╕ рдХреЛрдб рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд░ рдХреЗ рд╕рд╛рде рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣рд╛рдВ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИред рд▓рд╛рдЗрди 27 рдореЗрдВ, рд╣рдо рд╕реАрдзреЗ рдлрд╝рдВрдХреНрд╢рди рдХреЗ "рдЦреЛрдЬ рдЗрдВрдЬрди" рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рддреЗ рд╣реИрдВред рдЕрдЧрд▓рд╛, 28 рд▓рд╛рдЗрди рдкрд░, рд╣рдо рд╡рд╛рдкрд╕реА рдореВрд▓реНрдп рдФрд░ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдзреНрдпрд╛рди рд░рдЦрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ рдХрд╛ рдкреНрд░рдХрд╛рд░ рдкрд╣рд▓реЗ methodType рд╡рд┐рдзрд┐ рд╕реЗ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдлрд┐рд░ methodType рддрд░реАрдХреЗ рдХреА рдкреИрд░рд╛рдореАрдЯрд░ рд╕реВрдЪреА рдХреЗ рдкреНрд░рдХрд╛рд░ред рд▓рд╛рдЗрди 30 - рд╣рдо MethodHandle call рдФрд░ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдФрд░ mt рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде Test рдХреНрд▓рд╛рд╕ рдореЗрдВ рддрд░реАрдХреЛрдВ рдХреА рдЦреЛрдЬ MethodHandle рдкрд░рд┐рдгрд╛рдо MethodHandle рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред 31 рд▓рд╛рдЗрди рдкрд░, рд╣рдо рдкреИрд░рд╛рдореАрдЯрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рд╛рде test рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд░ рдкрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд╕реНрдХреНрд░реАрди рдкрд░ рдЕрдкреЗрдХреНрд╖рд┐рдд "рдмреА" рджреЗрдЦрддреЗ рд╣реИрдВред

Lookup рдХреНрд▓рд╛рд╕ рдореЗрдВ рдЕрднреА рднреА рдХреБрдЫ рддрд░реАрдХреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕реНрдереИрддрд┐рдХ рдХрд╛рд░реНрдпреЛрдВ рдХреА рдЦреЛрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд▓реЗрдХрд┐рди рд╣реЛрдорд╡рд░реНрдХ рдХреЗ рд▓рд┐рдП рдкрд╛рдардХ рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдирд╛ред

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


All Articles