- λͺ©μ°¨
- κ°μ
java.lang.Class<T>
- ν΄λμ€ μ 보 μ‘°ν
- μΈμ€ν΄μ€ μμ± λ° μ 보 μμ
- ν΄λμ€ μ 보 μ€ν
- 리νλ μ λ¨μ κ³Ό μ£Όμν μ
- μ°Έκ³
리νλ μ μ μλ°μ μ¬λ¬ νΉμ§μ€ νλλ€. (C, C++μ κ°μ μΈμ΄λ κ°μ§κ³ μμ§ μλ νΉμ§μ€ νλμ΄κΈ°λ νλ€.)
리νλ μ μ μ¬μ©νλ©΄ μ€ν μ€μΈ μλ° νλ‘κ·Έλ¨μ μ체μ μΌλ‘ κ²μ¬νκ±°λ λ΄λΆ μμ±λ€μ μ‘°μν μ μλ€.
λν, 리νλ μ μ ν΅ν΄ μΈμ€ν΄μ€ μμ±, λ©μλ μ€ν, νλ μ‘°ν λ° μμ λ±λ± μ¬λ¬ μ‘°μμ ν μ μλ€.
μ€μ λ‘ μ€νλ§(DI, Component Scan, ...)μ μ¬λ¬ λΌμ΄λΈλ¬λ¦¬(Object Mapper, ...)μμ 리νλ μ μ μ νμ©νκ³ μλ€.
μ΄λ² κΈμμ 리νλμ μ΄λ 무μμ΄λ©°, μ΄λ»κ² μ¬μ©νλμ§μ λν΄μ λ€λ€λ³΄κ³ μ νλ€.
리νλ μ
μ λν΄μ λ€λ£¨κΈ° μ μ κ°μ₯ λ¨Όμ μμμΌ νλ ν΄λμ€κ° μλ€. λ°λ‘ java.lang.Class<T>
μ΄λ€.
리νλ μ
μ Class<T>
λ₯Ό ν΅ν΄μ λμνλ€.
π€ Class<T>
Class
ν΄λμ€λ μλ° μ ν리μΌμ΄μ μμ λμνλ λͺ¨λ ν΄λμ€μ μΈν°νμ΄μ€λ₯Ό νννλ ν΄λμ€μ΄λ€.- μλ° μ ν리μΌμ΄μ
μμ λμκ°λ λͺ¨λ κ²μ ν΄λμ€μ μνλ€.
enum
,annotation
μ μΈν°νμ΄μ€- λ°°μ΄κ³Ό κΈ°λ³Έ μλ£ν λͺ¨λ
Class
λ‘ ννλλ€.
- μλ° μ ν리μΌμ΄μ
μμ λμκ°λ λͺ¨λ κ²μ ν΄λμ€μ μνλ€.
βοΈ Class<T>
λ public μμ±μκ° μλ€.
- κ·Έ μ΄μ λ μ¬μ©μκ°
Class
λ₯Ό μΈμ€ν΄μ€ννμ§ μκ³ , JVMμ΄ μΈμ€ν΄μ€νν΄μ£ΌκΈ° λλ¬Έμ΄λ€.- λ μ ννλ JVMμ ν΄λμ€ λ‘λκ° λ°μ΄νΈ μ½λ(
.class
)λ₯Ό μ½κ³ λ‘λ© λ¨κ³κ° λλλ©΄ ν΄λΉ ν΄λμ€ νμ μClass
κ°μ²΄λ₯Ό μμ±νμ¬Heap μμ
μ μ μ₯νλ€. - JVMμμ
defineClass
λΌλ λ©μλλ₯Ό νΈμΆνμ¬ μμ±νλ€κ³ νλ€.
- λ μ ννλ JVMμ ν΄λμ€ λ‘λκ° λ°μ΄νΈ μ½λ(
ν΄λμ€μ λν μ 보λ₯Ό κ°μ Έμ€κΈ° μν΄μ Class<T>
λ₯Ό μ¬μ©ν΄μΌ νλ€.
μλ° λ°νμλ
Class<T>
λ μ΄λ»κ² κ°μ Έμ¬ κΉ?
νμ .class
- λͺ¨λ ν΄λμ€λ JVMμ ν΅ν΄ λ‘λ©λ ν
Class
κ°μ²΄λ₯Ό μμ±νλ€. κ·Έλ¬λ―λ‘,νμ .class
λ₯Ό ν΅ν΄ μ κ·Όν μ μλ€.
- λͺ¨λ ν΄λμ€λ JVMμ ν΅ν΄ λ‘λ©λ ν
getClass()
- λͺ¨λ ν΄λμ€μ μΈμ€ν΄μ€λ
getClass()
λ₯Ό κ°μ§κ³ μλ€. μ¦, λͺ¨λ μΈμ€ν΄μ€λ₯Ό ν΅ν΄ ν΄λΉ ν΄λμ€λ₯Ό μ κ·Όν μ μλ€.
- λͺ¨λ ν΄λμ€μ μΈμ€ν΄μ€λ
Class.forName("FQCN")
- ν΄λμ€ μ΄λ¦(Fully Qualified Class Name)μ ν΅ν΄ κ°μ§κ³ μ¬ μ μλ€.
- μ°Ύλ ν΄λμ€κ° μμΌλ©΄
ClassNotFoundException
μ΄ λμ Έμ§.
Class<T>
λ₯Ό ν΅ν΄μ ν΄λμ€μ λν μ 보λ₯Ό κ°μ Έμ¬ μ μλ€.
νλ, λ©μλ, μμ ν΄λμ€, μΈν°νμ΄μ€, μ λ Έν μ΄μ , μμ±μ λ±λ± λͺ¨λ κ°μ Έμ¬ μ μλ€.
λ³΄ν΅ λ€ getXXX
μ ν΅ν΄ κ°μ Έμ€λ©°, μλμ κ°μ νΉμ§μ΄ μλ€.
getXXX()
μgetDeclaredXXX()
getXXX()
λ publicλ§ κ°μ Έμ¬ μ μλ€. nameμ ν΅ν κ²μλ λμΌνλ€.getDeclaredXXX()
λ μ κ·Ό μ μ΄μμ μκ΄μμ΄ λͺ¨λ μμ±κ³Ό λ©μλλ₯Ό κ°μ Έμ¬ μ μλ€.
- μ κ·Ό μ μ΄μ -
Modifier
- μ κ·Ό μ μ΄μκ° λΆμ μ μλ μ 보(ex. νλ, λ©μλ...)λ λͺ¨λ Modifierλ₯Ό κ°μ§λ€.
- Modifierλ₯Ό ν΅ν΄μ μ κ·Ό μ μ΄μκ° λ¬΄μμΈμ§ μ μ μλ€.
- ex.
isPrivate(field.getModifier())
리νλ μ μ ν΅ν΄ μ λ Έν μ΄μ μ λ€λ£¨κΈ° μν΄μ λͺ κ°μ§ λ μμμΌ νλ λΆλΆμ΄ μλ€.
μ°μ μ λ Έν μ΄μ μ μν μμ± μ λ Έν μ΄μ μ΄λ€.
@Retention
: ν΄λΉ μ λ Έν μ΄μ μ μΈμ κΉμ§ μ μ§ν κ²μΈμ§? ex.RetentionPolicy.SOURCE
(μ½λ),CLASS
(λ°μ΄νΈμ½λ),RUNTIME
(λ°νμ)@Inherit
: ν΄λΉ μ λ Έν μ΄μ μ νμ ν΄λμ€κΉμ§ μ λ¬ν κ²μΈμ§? μ΄ μ λ Έν μ΄μ μ λΆμ¬μ§ ν΄λμ€μ νμ ν΄λμ€κΉμ§ μ΄ μ λ Έν μ΄μ μ΄ λΆμ κ² μ²λΌ λμνλ€.@Target
: ν΄λΉ μ λ Έν μ΄μ μ μ΄λμ μ¬μ©ν μ μλμ§? ex.ElementType.FIELD
,ElementType.METHOD
...
μμΈν μ λ Έν μ΄μ μ¬μ©λ²μ μ¬κΈ°μ νμΈκ°λ₯νλ€.
λ νλ μ€μν μ μ @Inherit
μ λ°λ₯Έ μ‘°νλ€.
getAnnotation()
: μμλ°μ (@Inherit
)μ λ Έν μ΄μ κΉμ§ μ‘°νλλ€.getDeclaredAnnotations()
: μκΈ° μμ μλ§ λΆμ΄μλ μ λ Έν μ΄μ μ μ‘°νλλ€.
리νλ μ
μ ν΅ν΄ Class<T>
λ₯Ό μΈμ€ν΄μ€νν μλ μλ€.
λ κ°μ§ λ°©λ²μ΄ μ‘΄μ¬νλ€.
Class.newInstance()
-> νμ¬ deprecatedλμ΄μ κΆμ₯νμ§ μλλ€. (μ¬μ©μ μμΈκ° λ°μνλ€.)- μμ±μλ₯Ό ν΅ν μμ± -> κΆμ₯νλ μΈμ€ν΄μ€ λ§λλ λ°©λ²μ΄λ€.
κ°λ¨ν μμλ₯Ό ν΅ν΄ μ΄ν΄λ³΄μ.
public class User {
private String name;
private int age;
public User() {
}
public User(String name) {
this.name = name;
}
public User(String name, int age) {
this.name = name;
this.age = age;
}
// getter / setter
}
@Test
void μμ±μλ₯Ό_ν΅ν_μΈμ€ν΄μ€_λ§λ€κΈ°()
throws NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException, NoSuchFieldException {
// given
Class<?> classOfUser = User.class;
// when
// Stringμ 맀κ°λ³μλ‘ κ°μ§ κ°μ§ μμ±μ κ°μ Έμ΄.
Constructor<?> constructor = classOfUser.getConstructor(String.class);
User user = (User) constructor.newInstance("binghe");
// private Field μ κ·Ό ν μμ
Field age = classOfUser.getDeclaredField("age"); // νλ μ κ·Ό
age.setAccessible(true);
age.set(user, 10); // νλ μμ (λ³κ²½νκ³ μ νλ κ°μ²΄, κ°)
// then
assertThat(user.getName()).isEqualTo("binghe");
assertThat(user.getAge()).isEqualTo(10);
}
- νλ κ° μ κ·Ό λ° μ€μ νκΈ°
- νΉμ μΈμ€ν΄μ€κ° κ°μ§κ³ μλ κ°μ κ°μ Έμ€κ³ μμ νλ κ²μ΄κΈ° λλ¬Έμ μΈμ€ν΄μ€κ° νμν¨.
- νλ μ κ·Ό:
Field.get(object)
- νλ μμ :
Field.set(object, value)
- Static νλλ κ°μ Έμ¬ λ μΈμ€ν΄μ€(object)κ° νμ μκΈ° λλ¬Έμ
null
μ λκΈ°λ©΄ λλ€.
- Static νλλ κ°μ Έμ¬ λ μΈμ€ν΄μ€(object)κ° νμ μκΈ° λλ¬Έμ
λ§μ§λ§μΌλ‘ 리νλμ μ ν΅ν΄ λ©μλ μ€νμ ν΄λ³΄μ.
Object Method.invoke(object, params);
public class User {
private String name;
public User() {
}
public User(String name) {
this.name = name;
}
public String sayHi() {
return "hi";
}
}
@Test
void λ©μλ_μ€ν()
throws NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
// given
Class<?> classOfUser = User.class;
// when
// κ°μ²΄ μμ±
Constructor<?> constructor = classOfUser.getConstructor(String.class);
User user = (User) constructor.newInstance("binghe");
// λ©μλ λΆλ¬μ€κΈ°
Method sayHi = classOfUser.getMethod("sayHi");
// then
// λ©μλ μ€ν λ° ν
μ€νΈ
assertThat(sayHi.invoke(user)).isEqualTo("hi");
}
μλ λ¬Έμ μ μ μλͺ» μ¬μ©ν κ²½μ°μλ§ ν΄λΉλλ€. μ μ¬μ©νλ©΄ κ°λ ₯ν κΈ°λ₯μ΄λ€!
- μ§λμΉ μ¬μ©μ μ±λ₯ μ΄μλ₯Ό μΌκΈ°ν μ μλ€.
- λ°λμ νμν κ²½μ°μλ§ μ¬μ©ν κ²μ μΆμ²νλ€.
- μ»΄νμΌ νμμ νμΈλμ§ μκ³ λ°νμ μμλ§ λ°μνλ λ¬Έμ λ₯Ό λ§λ€ κ°λ₯μ±μ΄ μλ€.
- μ κ·Ό μ§μμλ₯Ό μλμ μΌλ‘ 무μν μ μκΈ° λλ¬Έμ μμΉ«νλ©΄ 보μμ μ΄μ κ° λ°μν μ μλ€.