자바 리플렉션은 클래스, 인터페이스, 메소드들을 찾을 수 있고, 객체를 생성하거나 변수를 변경할 수 있고 메소드를 호출할 수도 있다.
Reflection은 class, constructor, method, field 의 정보를 가져올 수 있다.
Class c = (찾고싶은)클래스명.class;
c.getName();
위 코드는 효승.class를 그냥 할당하는 것이다. 그래서 효승.class의 정보를 알 수 있었다.
하지만 클래스를 참조하지 못하고 이름만 알고있을 때에는 이렇게 할 수 있다.
Class c = Class.forName("이름");
c.getName();
Constructor constructor = c.getDeclaredConstructor();
만약 인자가 있는 생성자를 찾고 싶을 때에는
c.getDeclaredConstructor(String);
이런 식으로 인자를 넣으면 타입과 일치하는 생성자를 찾는다.
add(int a, int b) return a+b;
라는 함수가 있을 때
호출은 invoke()로 할 수 있다.
Method method = c.getDeclaredMethod("add");
int returnVal = method.invoke(5, 2);
Field field = c.getDeclaredField("변수명");
클라이언트에서 서버로 수정요청을 보낼 때, 모든 필드가 채워져 보내지는 경우도 있지만 모든 필드가 안 채워서 오는 경우도 있다.
이 경우에 null이 올 수도 있는데 데이터에 반영이 되면 안된다.
이런 경우에 자세히는 모르지만 Reflection을 쓸 수 있다고 한다.
람다 함수는 익명 함수를 지칭하는 용어이다.
(매개변수)->{함수 몸체}
(int a, int b)->{return a+b;}
어떤 프로젝트를 개발자A 와 개발자B 가 분담하여 만든다고 하자.
A는 클래스를 만들고 B는 클래스를 사용하는 로직을 만들 때,
A는 매개변수 2개만 필요하다 생각하여 2개만 있는 함수를 만들었고
B는 매개변수 3개가 필요하다 생각하여 3개가 있는 함수를 만들면
문제가 발생한다...
따라서 이럴 때 필요한 것은 협업자 상호 간의 구체적인 약속이다.
클래스를 사용할 개발자가 메소드를 인터페이스로 만들어서 제공하면 클래스를 만드는 개발자는 그에 맞게 구현하면 되고 반대의 경우도 가능하다.
interface Math {public int Calculate(int i, int j); } // 인터페이스
main () {
Math plusLamda = (first, second)->first+second;
print(plusLamda.calculate(4,3);
}
기존 java처럼 서비스 클래스에서 new하여 생성하는 경우
객체를 생성하고 삭제하는 연산을 모두 서비스 클래스에서 한다.
하지만 기존 java와 달리 스프링 컨테이너에게 객체를 맡기는 경우
간단하게 객체를 생성하고 관리하는 건 스프링 프레임워크가 해주니까 우리는 서비스만 하면 된다?!