본문 바로가기
자바웹프로그래밍/JAVA

java reflection 이용해서 private feild 불러오기

by 디찌s 2022. 8. 5.
728x90
반응형

자바 Reflection?

구체적인 클래스 타입을 알지 못해도 그 클래스의 메소드 및 타입,변수들에 접근 할수 있도록 해주는 자바 API이다

 

자바는 컴피일단계 ,런타임단계가 존재하는데

 

런타임단계에선 메모리 힙 영역에 new 등으로 생성된 객체들이 들어가며 자바의 리플렉션은 이 메모리 힙영역에서 클래스,인터페이스,메소드들을 찾을수 있으며 객체를 생성하거나 변수를 변경하거 메소드를 호출할수있다.

 

이번에 시도해볼건 object에 field를 가져와서 수정해볼것이다.

 

 

 

 public List decryptListBeanUsingCBC256(List listData, String... parameters) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException, NoSuchFieldException {

        for(Object bean : listData){
            for(String param:parameters) {
                Field getfield = bean.getClass().getDeclaredField(param);
                getfield.setAccessible(true);
                String data = (String) getfield.get(bean);
                String decryptData = "";
                try {
                    decryptData = this.aesUtils.decrypt(data, this.dek_key);
                }catch(NullPointerException e){
                    decryptData = data;
                }
                Field setfield = bean.getClass().getDeclaredField(param);
                setfield.setAccessible(true);
                setfield.set(bean,decryptData);



            }
        }

        return listData;
    }

 

위 코드는 복호화하기 위한 공통 코드이다.

 

위 함수는 파라미터에 List<vobean> 형식을 넣어야하며 , String... paramters를 통해 여러가지 vo와 칼럼이름이 값이 맵핑되도록 받아서 dto.filed = param 이런식으로 맵핑하여 하나하나 암호화된 데이터를 복호화 시킨후 다시 vo에 저장후 전체 데이터가 복호화 되면

list를 리턴한다.

 

이때 vo는 무엇이 들어올지 모르고 그렇기에 Object확장자를 사용했다.

 

또한 vo는 private로 필드를 보호하므로 접근하려면 reflection을 사용해야한다.

 

Field getfield = bean.getClass().getDeclaredField(param);

 

위 코드는 object에서 클래스를 가져오고 private필드에 접근할수있는 코드이다. 위코드 말고

 

Field getfield = bean.getClass().getField(param);

 

위코드로 처럼 사용할수도 있지만 이것은 클래스 내부에 필드가 public이어야 접근가능하다.

 

getfield.setAccessible(true); 

 

위코드는 가져온 필드를 수정할수 있도록 허용하는 메소드이다.

 

위와같은 코드를 통해 동적으로 필드를 찾아 그 안에 값을 변경할수 있는 작업을 할수 있다.

  

728x90
반응형

댓글