관리 메뉴

Tech Log πŸ› οΈ

μžλ°” Reflection μ΄λž€ λ³Έλ¬Έ

μΉ΄ν…Œκ³ λ¦¬ μ—†μŒ

μžλ°” Reflection μ΄λž€

sehaan 2023. 9. 30. 20:26

λ¦¬ν”Œλ ‰μ…˜μ΄λž€?

μžλ°” 곡식 λ¬Έμ„œμ—μ„œλŠ” λ¦¬ν”Œλ ‰μ…˜μ„ λ‹€μŒκ³Ό 같이 μ •μ˜ν•˜κ³  μžˆλ‹€.

 

 Reflection enables Java code to discover information about the fields, methods and constructors of loaded classes, and to use reflected fields, methods, and constructors to operate on their underlying counterparts, within security restrictions. The API accommodates applications that need access to either the public members of a target object (based on its runtime class) or the members declared by a given class. It also allows programs to suppress default reflective access control.

 

κ°„λ‹¨ν•˜κ²Œ 해석해보면, μžλ°” μ½”λ“œλ₯Ό 톡해 λ‘œλ“œλœ ν΄λž˜μŠ€μ— λŒ€ν•΄ μ ‘κ·Ό μ œν•œμžμ™€ 관계 없이 ν•„λ“œ , μƒμ„±μž , λ©”μ†Œλ“œλ₯Ό μ΄μš©ν•  수 있고 ν•  수 μžˆλ‹€κ³  ν•œλ‹€.

 

λ‘œλ“œλœ ν΄λž˜μŠ€λž€ , 클래슀 λ‘œλ” λ‚΄μ—μ„œ 클래슀λ₯Ό λ‘œλ“œν•œ 후에 ν•΄λ‹Ή 클래슀의 정보λ₯Ό 담은 객체λ₯Ό νž™μ— μ €μž₯ν•΄ λ‘” 것이닀.

 

https://cb036133.tistory.com/132

 

JVM λ‚΄λΆ€λ‘œ

JVMμ΄λž€? μžλ°”λ₯Ό 가지고 코딩을 ν•˜λŠ” μ‚¬λžŒμ€ ν•œλ²ˆ μ―€ JVM μ΄λž€ 단어λ₯Ό 듀어왔을 것이닀. 이 JVM은 μ»΄ν“¨ν„°μ™€μ˜ μ†Œν†΅μ„ λ„μ™€μ£ΌλŠ”λ°, μ–΄λ–€ μ‹μœΌλ‘œ μ†Œν†΅μ„ λ„μ™€μ£ΌλŠ” 지 λ‹¨κ³„λ³„λ‘œ μ‚΄νŽ΄λ³΄μž λ¨Όμ € μš°λ¦¬κ°€

cb036133.tistory.com

 

μ™œ μ‚¬μš©ν• κΉŒ?

λ¦¬ν”Œλ ‰μ…˜μ„ μ‚¬μš©ν•˜λ©΄ μ ‘κ·Ό μ œν•œμžμ™€ 상관없이 λͺ¨λ“  클래슀λ₯Ό μ΄μš©ν•  수 μžˆλ‹€.

사싀 이것은 μΊ‘μŠν™”, 은닉화λ₯Ό 무λ ₯ν™” μ‹œν‚€λŠ” 건데 였히렀 μ‚¬μš©μ„ 지양해야 ν•˜μ§€ μ•Šμ„κΉŒ?

 

μ†Œκ·œλͺ¨μ˜ ν”„λ‘œκ·Έλž¨μ—μ„œλŠ” λ¦¬ν”Œλ ‰μ…˜μ˜ μ‚¬μš©μ΄ 뢀적합할 수 μžˆλ‹€.

ν•˜μ§€λ§Œ νŒ¨ν‚€μ§€ , λͺ¨λ“ˆ ꡬ쑰가 λ³΅μž‘ν•˜κ³  의쑴 관계 νŒŒμ•…μ΄ νž˜λ“  ν”„λ‘œμ νŠΈμ—μ„œλŠ” λ¦¬ν”Œλ ‰μ…˜μ΄ μ£ΌλŠ” 이점이 λ§Žλ‹€.

 

λŒ€ν‘œμ μœΌλ‘œ μ–΄λ…Έν…Œμ΄μ…˜μ΄ μžˆλŠ”λ° μ–΄λ…Έν…Œμ΄μ…˜μ„ μ‚¬μš©ν•˜λ©΄ ν”„λ ˆμž„μ›Œν¬μ—μ„œ 탐색 ν›„ ν•΄λ‹Ή 클래슀λ₯Ό 관리해쀀닀.

μ—¬κΈ°μ„œ λ¦¬ν”Œλ ‰μ…˜μ˜ 기술이 μ‚¬μš©λ˜μ—ˆλŠ”λ° , 즉 λŸ°νƒ€μž„ μ‹œμ μ— 객체λ₯Ό 생성할 수 μžˆλŠ” 것이닀

 

λ¦¬ν”Œλ ‰μ…˜μ€ 주둜 ν”„λ ˆμž„μ›Œν¬λ‚˜ λΌμ΄λΈŒλŸ¬λ¦¬μ—μ„œλŠ” 컴파일 μ‹œμ μ— μ•Œ 수 μ—†λŠ” 정보λ₯Ό λŸ°νƒ€μž„ μ‹œμ μ— 뢈러였기 μœ„ν•΄ μ‚¬μš©ν•œλ‹€.

 

μ–΄λ–»κ²Œ μ‚¬μš©ν• κΉŒ?

 

1. 클래슀 찾기

Class<Test> ReflectionTest = Test.class;

 

2.μƒμ„±μž μ°ΎκΈ°

Test test = new Test();
Class<? extends Test> getClassTest = test.getClass();

 

3.λ©”μ†Œλ“œ μ°ΎκΈ°

Class<?> ReflectionTest = Class.forName("Test");

 

μ—¬κΈ°μ„œ μ€‘μš”ν•œ 점은 μ–΄λ–€ λ°©λ²•μœΌλ‘œ μΈμŠ€ν„΄μŠ€λ₯Ό κ°€μ Έμ˜€λ˜ λͺ¨λ‘ 같은 μΈμŠ€ν„΄μŠ€λΌλŠ” 것이닀 !

 

이제 κ°€μ Έμ˜¨ μΈμŠ€ν„΄μŠ€λ“€μ„ μ–΄λ–»κ²Œ ν™œμš©ν•˜λŠ” 지 μ•Œμ•„λ³΄μž

 

μ˜ˆμ‹œ μ½”λ“œ

 

λ¨Όμ € μƒμ„±μžλ₯Ό κ°€μ Έμ˜€λŠ” μ½”λ“œ !

// λͺ¨λ“  μƒμ„±μžλ“€μ„ κ°€μ Έμ˜¬ 수 μžˆλ‹€.
Arrays.stream(testClass.getConstructors()).forEach(System.out::println);

//μƒμ„±μžλ₯Ό λ¦¬ν”Œλ ‰μ…˜μœΌλ‘œ κ°€μ Έμ™€μ„œ 객체λ₯Ό 생성할 수 μžˆλ‹€.
Constructor<? extends Test> constructor = 
				getClassTest.getConstructor(null);
                
// λ¦¬ν”Œλž™μ…˜μœΌλ‘œ κ°€μ Έμ˜¨ μƒμ„±μžλ₯Ό 톡해 객체 생성                
Test test1 = constructor.newInstance();

// μƒμ„±μžμ— ν•„μš”ν•œ νŒŒλΌλ―Έν„° νƒ€μž…λ“€μ„ μ„€μ •ν•  수 μžˆλ‹€.
Constructor<? extends Test> stringConstructor = 
        		getClassTest.getConstructor(String.class, String.class, String.class);
                
// λ¦¬ν”Œλž™μ…˜μœΌλ‘œ κ°€μ Έμ˜¨ μƒμ„±μžλ₯Ό 톡해 객체 생성                     
Test test2 = stringConstructor.newInstance("param1", "param2", "param3");
}

 

λ‹€μŒμ€ λ©”μ†Œλ“œλ₯Ό κ°€μ Έμ™€μ„œ μ΄μš©ν•΄λ³΄μž

//μΈμŠ€ν„΄μŠ€ ν•„λ“œλ₯Ό κ°€μ Έμ˜¬ 수 μžˆλ‹€.
Field c = getClassTest.getDeclaredField("field1");

// ν•„λ“œ 접근은 ν—ˆμš©μ‹œμΌœμ€€λ‹€.
field1.setAccessible(true);

// ν•„λ“œλ₯Ό λ³€κ²½ν•  수 μžˆλ‹€.
c.set(test, "fieid1_modified"); 

// λ©”μ†Œλ“œλ„ κ°€μ Έμ˜¬ 수 μžˆλ‹€.
Method func = getClassTest.getDeclaredMethod("func");

// λ©”μ†Œλ“œ 호좜!
func.invoke(test);

 

 

λ¦¬ν”Œλ ‰μ…˜μ˜ μž₯/단점

 

μž₯점

1. λŸ°νƒ€μž„μ— 객체λ₯Ό μƒμ„±ν•˜κ³  μƒμ„±μž , λ©”μ†Œλ“œ , ν•„λ“œλ₯Ό μ΄μš©ν•  수 μžˆλ‹€.

 

단점

1. μΊ‘μŠν™”λ₯Ό μ €ν•΄ν•  수 μžˆλ‹€.

2. 가독성을 μ €ν•΄μ‹œν‚¬ 수 μžˆλ‹€.

3. 일반적으둜 μ‚¬μš©ν–ˆμ„ λ•Œλ³΄λ‹€ 처리 μ„±λŠ₯이 떨어진닀.

 

 

참고자료

https://papimon.tistory.com/82

 

Reflection API

μ•ˆλ…•ν•˜μ„Έμš”! μ‘°μ—˜μž…λ‹ˆλ‹€! πŸŽ‰ μ˜€λŠ˜μ€ μžλ°”μ˜ Reflection API에 λŒ€ν•΄ μ•Œμ•„λ³΄λŠ” μ‹œκ°„μ„ κ°€μ Έλ³Όκ²Œμš”! πŸ’ͺπŸ’ͺ ν”Όλ“œλ°± ν™˜μ˜μž…λ‹ˆλ‹€! λŒ“κΈ€ λ‹¬μ•„μ£Όμ„Έμš” :) *** Reflection APIλž€? *** Reflection API의 μ •μ˜λ₯Ό λ¨Όμ € μ•Œμ•„

papimon.tistory.com

https://medium.com/msolo021015/%EC%9E%90%EB%B0%94-reflection%EC%9D%B4%EB%9E%80-ee71caf7eec5

 

μžλ°” Reflectionμ΄λž€?

λ§Žμ€ μž…λ¬Έμš© μžλ°” μ„œμ μ—μ„œ 잘 닀루지 μ•ŠλŠ” Reflectionμ΄λΌλŠ” κ°œλ…μ— λŒ€ν•΄μ„œ μ•Œμ•„λ³΄λ €κ³  ν•©λ‹ˆλ‹€.

medium.com

https://brunch.co.kr/@oemilk/172

 

Effective Java - ν”„λ‘œκ·Έλž˜λ° 일반

#53 λ¦¬ν”Œλ ‰μ…˜λ³΄λ‹€λŠ” μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ‚¬μš©ν•˜μž | Effective Java - ν”„λ‘œκ·Έλž˜λ° 일반 #53 λ¦¬ν”Œλ ‰μ…˜λ³΄λ‹€λŠ” μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ‚¬μš©ν•˜μž λ¦¬ν”Œλ ‰μ…˜(Reflection)은 λ©”λͺ¨λ¦¬μ— λ‘œλ“œλœ ν΄λž˜μŠ€λ“€μ˜ κ΄€ν•œ 정보λ₯Ό ν”„λ‘œκ·Έλž¨

brunch.co.kr