рдХреНрдпрд╛ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ .getClass () рд░рд┐рдЯрд░реНрди рдХреНрдпрд╛ рд╣реИ?

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд▓рдЧрднрдЧ рдХрд┐рд╕реА рднреА рдЬрд╛рд╡рд╛ рдбреЗрд╡рд▓рдкрд░ рдХреЛ рдПрдХ рд╕рд╛рдХреНрд╖рд╛рддреНрдХрд╛рд░ рдореЗрдВ рдкреВрдЫрд╛ рдЧрдпрд╛ рдерд╛: "рдСрдмреНрдЬреЗрдХреНрдЯ рдХреНрд▓рд╛рд╕ рдХреЗ рддрд░реАрдХреЗ рдХреНрдпрд╛ рд╣реИрдВ?"
рдХрдо рд╕реЗ рдХрдо рдореБрдЭрд╕реЗ рдмрд╛рд░-рдмрд╛рд░ рдкреВрдЫрд╛ рдЧрдпрд╛ред рдФрд░, рдЕрдЧрд░ рдкрд╣рд▓реА рдмрд╛рд░ рдпрд╣ рдЖрд╢реНрдЪрд░реНрдп рд╣реБрдЖ (рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдХреНрд▓реЛрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреВрд▓ рдЧрдпрд╛ рдерд╛), рддреЛ рдореБрдЭреЗ рдпрдХреАрди рдерд╛ рдХрд┐ рдореБрдЭреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рддрд░реАрдХреЗ рдкрддрд╛ рд╣реИрдВ;)

рдФрд░ рдЬрдм рд╡рд┐рдХрд╛рд╕ рдХреЗ рдХрдИ рд╡рд░реНрд╖реЛрдВ рдХреЗ рдмрд╛рдж, рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реБрдЖ, рддреЛ рдореИрдВрдиреЗ рдЧреЗрдЯрдХреНрд▓рд╛рд╕ () рдкрджреНрдзрддрд┐ рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреА рдЕрдкрдиреА рдЕрдЬреНрдЮрд╛рдирддрд╛ рдкрд░ рдзреНрдпрд╛рди рджрд┐рдпрд╛ред

рдХрдЯ рдСрдл рдХреНрд▓рд╛рд╕, .class, .getClass рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЖрд╢реНрдЪрд░реНрдп рдХреА рдмрд╛рдд рд╣реИ рдХрд┐ рдореИрдВ рднрд░ рдЖрдпрд╛ рдерд╛ред


рддреЛ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╡рд░реНрдЧ рдП рдФрд░ рдЗрд╕ рд╡рд░реНрдЧ рдХреА рдПрдХ рд╡рд╕реНрддреБ рд╣реИ:
public class A { } ... A a = new A(); 


0. A.class рдмрдирд╛рдо a.getClass ()


рдЪрд▓реЛ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рдХреЙрд▓рд┐рдВрдЧ рдЧреЗрдЯрдХреНрд▓рд╛рд╕ () рдмрд╣реБрд░реВрдкрддрд╛ рдХрд╛ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдПрдХ рд╡рдВрд╢рдЬ рд╡рд░реНрдЧ рд╣реЛрдЧрд╛ред
 public class B extends A { { ... A a1 = new B(); a1.getClass(); //   ,  B.class 


рдЫрд┐рдкрд╛ рд╣реБрдЖ рдкрд╛рда
рдПрдХ рдЭреВрда рдерд╛ рдЬреЛ рдореБрдЭреЗ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рд╡рд░реНрдЧ рдПрдХ рд╕реНрдерд┐рд░ рдХреНрд╖реЗрддреНрд░ рдирд╣реАрдВ рд╣реИ, рдЬрд┐рд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рдпрд╣ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ (рдФрд░ рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдерд╛ рдХрд┐ рдПрдХ рджреЗрд╢реА-рдЫрджреНрдо-рд╕реНрдерд┐рд░ рдХреНрд╖реЗрддреНрд░ рднреА рдирд╣реАрдВ рд╣реИ), рд▓реЗрдХрд┐рди рднрд╛рд╖рд╛ рдХрд╛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдирд┐рд░реНрдорд╛рдгред рдФрд░, рдПрдХ рд╕реНрдерд┐рд░ рдХреНрд╖реЗрддреНрд░ рдХреЗ рд╡рд┐рдкрд░реАрдд, рдЖрдк рдЗрд╕реЗ рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХреНрд╕реЗрд╕ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ!
 a.class; // Compile error! Unknown class: "a" 



рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд╣реИ, рдлреВрд▓ред рдЖрдЧреЗ рдмрдврд╝реЛред

1. рдФрд░ рдпрд╣ рдЖрдкрдХреА рдХрдХреНрд╖рд╛ рдХреНрдпрд╛ рд╣реИ?


рдПрдХреНрд▓рд╛рд╕ - рдХрдХреНрд╖рд╛ рдХреА рдПрдХ рд╡рд╕реНрддреБред рд╣рдо Class.java рдореЗрдВ рджреЗрдЦрддреЗ рд╣реИрдВ:
 public final class Class<T> implements ... 

рдпрд╣ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдмрд╛рдд рд╣реИред рдФрд░ рдпрд╣ рдЯрд╛рдЗрдк рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдЗрд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рдмрд╣реБрдд рд╣реА рдП - рд╡рд░реНрдЧ, рдЬрд┐рд╕рдореЗрдВ рд╕реЗ .class рдХреЛ рдмреБрд▓рд╛рдпрд╛ рдЧрдпрд╛ рдерд╛

рдпрджрд┐ рдЖрдк рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ: рдЕрдм, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдЖрдк рдПрдХ рд╡рд┐рдзрд┐ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рддрд░реНрдХ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рдордирдорд╛рдирд╛ рдкреНрд░рдХрд╛рд░ рджреЗрддрд╛ рд╣реИ:
 public <T> T foo(Class<T> clazz); 

рдПред рдХреНрд▓рд╛рд╕ рдХреНрд▓рд╛рд╕ рдХреА рдПрдХ рд╡рд╕реНрддреБ рд▓реМрдЯрд╛рддрд╛ рд╣реИ:
 Class<A> result = A.class; // Compilation successfull 


2. рдФрд░ a.getClass () рдХреНрдпрд╛ рд▓реМрдЯрд╛рддрд╛ рд╣реИ?


рдЙрдкрд░реЛрдХреНрдд рд╕рднреА рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдк рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐:
 Class<A> result1 = a.getClass(); // Compilation error! 

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдмрд╣реБрд░реВрдкрддрд╛ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдХрд┐рд╕реА рдХреЛ рдпрд╣ рдирд╣реАрдВ рднреВрд▓рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╡рд╕реНрддреБ рдХрд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╡рд░реНрдЧ a - рдЬрд░реВрд░реА рдирд╣реАрдВ A - рдпрд╣ рдХреЛрдИ рднреА рдЙрдкрд╡рд░реНрдЧ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:
 Class<? extends A> result = a.getClass(); // Compilation successfull 


3. рдФрд░ Object.java рдореЗрдВ рдХреНрдпрд╛ рд▓рд┐рдЦрд╛ рд╣реИ?


рдпреЗ рд╕рднреА рдЬреЗрдирд░рд┐рдХ рдмрд╣реБрдд рдЕрдЪреНрдЫреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрдк рдСрдмреНрдЬреЗрдХреНрдЯ рдХреНрд▓рд╛рд╕ рдореЗрдВ рдЬрд╛рд╡рд╛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд╕рд╛рде рдЧреЗрдЯрдХреНрд▓рд╛рд╕ рд╡рд┐рдзрд┐ рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреИрд╕реЗ рд▓рд┐рдЦрддреЗ рд╣реИрдВ?
рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдирд╣реАрдВ:
 public final native Class<?> getClass(); 

рдФрд░ рдЗрд╕ рд╕рд╡рд╛рд▓ рдкрд░ рдХрд┐ рдКрдкрд░ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХрд╛ рд╕рдВрдХрд▓рди рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛, рдореИрдХреНрд╕рд┐рдо рдкреЛрддрд╛рд╢реЗрд╡ рдЬрд╛рджрд╡реЛрдХ рд╡рд┐рдзрд┐ рдХрд╛ рдЬрд╡рд╛рдм рджреЗрдВрдЧреЗ:
рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рдХрд╛рд░ рдХрдХреНрд╖рд╛ <рд╣реИ? extends | X |> рдХрд╣рд╛рдВ | X | рдЙрд╕ рд╕реНрдЯреИрдЯрд┐рдХ рдкреНрд░рдХрд╛рд░ рдХреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╣реИ, рдЬрд┐рд╕ рдкрд░ getClass рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред


рддреЛ Object.java рдореЗрдВ рдПрдХ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд▓рд┐рдЦрд╛ рд╣реИ, рдФрд░ рд╕рдВрдХрд▓рдХ рджреВрд╕рд░реЗ рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реИред

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


All Articles