-
java reflection 이용해서 private feild 불러오기자바웹프로그래밍/JAVA 2022. 8. 5. 15:43728x90반응형
자바 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반응형'자바웹프로그래밍 > JAVA' 카테고리의 다른 글
Reader,Writer(문자 기반 스트림) with java (0) 2024.02.27 InputStream,OutputStream 입출력 방식 분석 with java (0) 2024.02.27 maven을 통한 jar 생성할때 dependency(의존성) library 포함 후 jar 생성방법 (0) 2023.01.09 ImmutableMap이란? (2) 2020.11.17 JAVA HashMap 이 무엇인가? and 사용법 (0) 2020.11.11