Bepoz
파즈의 공부 일기
Bepoz
전체 방문자
오늘
어제
  • 분류 전체보기 (232)
    • 공부 기록들 (85)
      • 우테코 (17)
    • Spring (85)
    • Java (43)
    • Infra (17)
    • 책 정리 (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Bepoz

파즈의 공부 일기

Java

[Java] Reflection 사용법 정리

2021. 9. 8. 17:07

Reflection 사용법 정리

클래스 객체 검색

Object.getClass();

    class Bepoz {
        int value;

        public Bepoz(int value) {
            this.value = value;
        }
    }

Bepoz bepoz = new Bepoz(10);
Class<? extends Bepoz> aClass = bepoz.getClass();

.class 를 이용

Class<Bepoz> bepozClass = Bepoz.class;

Class.forName()

Class<?> aClass1 = Class.forName("reflection.Bepoz");
//Bepoz 클래스는 reflection 패키지 내부에 있음

기본 유형 래퍼의 TYPE 필드

Class<Double> type = Double.TYPE;
Class<Integer> type1 = Integer.TYPE;
Class<Void> type2 = Void.TYPE;

클래스를 반환하는 메서드

public class Bepoz extends Parent {
    int value;

    public Bepoz(int value) {
        this.value = value;
    }
}

Class<?> superclass = bepoz.getClass().getSuperclass();
Class<? super Bepoz> superclass1 = Bepoz.class.getSuperclass();
//Parent.class 가 반환됨

필드, 메서드, 생성자 이용하기

image

접근 제어자를 무시하고 갖고오고 싶으면 Declared 붙은 것 사용하자. 하지만, 부모한테 있는 것들은 받아올 수 없다.
없이 사용하면 private 은 들고 올 수 없다. default-private 도 안되는 것을 확인했다.

필드 가져오기

public class Bepoz extends Parent {

    public int publicField;
    private int privateField;

    public Bepoz(int publicField) {
        this.publicField = publicField;
    }

    public int getPublicField() {
        return publicField;
    }

    public void setPublicField(int publicField) {
        this.publicField = publicField;
    }
}

Field pubField = aClass.getField("publicField");
//public int reflection.Bepoz.publicField
Field priField = aClass.getDeclaredField("secret");
//private int reflection.Bepoz.privateField

필드 값 변경하기

        Bepoz bepoz = new Bepoz(10);
        Class<? extends Bepoz> aClass = bepoz.getClass();
        Field pubField = aClass.getField("publicField");
        pubField.set(bepoz, 100);
        Field priField = aClass.getDeclaredField("privateField");
        priField.setAccessible(true);
        priField.set(bepoz, 1000);

perivateField 의 경우 private 이어서 바로 set 으로 변경할 수가 없다.
setAccessible(true); 를 이용해서 set 이 가능하게끔 하였다.

메서드 가져오고 실행하기

    public void publicMethod() {
        System.out.println("publicMethod");
    }

    public void publicMethod(int param) {
        System.out.println("publicMethodWithParams - " + param);
    }

//Bepoz 클래스에 추가
Method publicMethod = aClass.getMethod("publicMethod");
Method publicMethodWithParam = aClass.getMethod("publicMethod", int.class);
publicMethod.invoke(bepoz);
publicMethodWithParam.invoke(bepoz, 100);

마찬가지로 getDeclaredMethod가 마련되어 있다. main(String[] args) 함수 호출을 원할 경우에는 invoke(Object obj, Object args...) 의 obj 에 null 을 넣어주자.

생성자 가져오고 객체 생성하기

Bepoz bepoz = new Bepoz(10);
Class<? extends Bepoz> aClass = bepoz.getClass();

Constructor<? extends Bepoz> constructor = aClass.getConstructor(int.class);
Bepoz madeBepoz = constructor.newInstance(10000);
assertThat(madeBepoz.publicField).isEqualTo(10000);

생성자 또한 메서드와 마찬가지로 private 생성자를 가져오고 생성하기를 원한다면,

Constructor<? extends Bepoz> constructor = aClass.getDeclaredConstructor(int.class);
constructor.setAccessible(true);
Bepoz madeBepoz = constructor.newInstance(10000);
assertThat(madeBepoz.publicField).isEqualTo(10000);

Declared~~ 와 setAccessible 를 사용하면 된다.


docs를 보고 간단히 따라해보았다. 다른 정보가 필요하다면 docs에서 찾아서 더 사용하면 될 것 같닫.


REFERENCE

https://docs.oracle.com/javase/tutorial/reflect/index.html

'Java' 카테고리의 다른 글

[Java] ThreadLocal에 대해  (0) 2021.12.05
[Java] Atomic, Volatile, Synchronized 에 대해  (2) 2021.09.20
[Java] ExecutorService 와 ThreadPoolExecutor 에 대해  (0) 2021.09.06
[Java] CountDownLatch, Semaphore, CyclicBarrier 에 대해  (0) 2021.09.06
[Java] OutputStream, InputStream, File 간단 사용법 정리  (0) 2021.09.05
    'Java' 카테고리의 다른 글
    • [Java] ThreadLocal에 대해
    • [Java] Atomic, Volatile, Synchronized 에 대해
    • [Java] ExecutorService 와 ThreadPoolExecutor 에 대해
    • [Java] CountDownLatch, Semaphore, CyclicBarrier 에 대해
    Bepoz
    Bepoz
    https://github.com/Be-poz/TIL

    티스토리툴바