https://sundaland.tistory.com/50 다이나믹 프록시 클래스는 런타임에, 지정된 인테페이스 목록을 구현하는 클래스이다. 이러한 클래스의 인스턴스를 통해 인터페이스의 메서드를 호출하면 해당 호출이 인코딩되어 다른 객체로 전달된다. https://blank001.tistory.com/43이 객체는 일관된 인터페이스를 통해 호출을 처리하게 된다. 따라서 다이나믹 프록시 클래스는 컴파일 타임 도구를 사용하지 않고도 인터페이스 목록에 대한 타입이 안전한 프록시 객체를 생성하는데 사용할 수 있다.https://blank001.tistory.com/44다이나믹 프록시 클래스의 인스턴스에서 메서드가 호출되면, 이 호출은 해당 인스턴스의 Invocation Handler에 있는 단일 메서드 (Inv..
Reflection
https://sundaland.tistory.com/302[ ▶ Arrays and Enumerated Types ]배열은 컴포넌트 타입과 길이를 가지고 있으며, 길이는 타입의 일부가 아니다. 배열은 전체적으로 또는 컴포넌트별로 조작할 수 있다. 리플렉션은 후자의 목적을 위해 java.lang.reflect.Array 클래스를 제공한다.[ ▶ 배열(Arrays) ]배열은 컴포넌트 타입과 길이를 가지고 있으며, 길이는 타입의 일부가 아니다. 배열은 전체적으로 또는 컴포넌트 별로 조작할 수 있다. 리플렉션은 후자의 목적을 위해 java.lang.reflect.Array 클래스를 제공한다. 배열 타입 식별 (Identifying Array Types) : 클래스 멤버가 배열 타입의 필드인지 여부를 확인하는 ..
https://sundaland.tistory.com/57 단순 이름 (unqualified name)이라는 용어는 자바에서 주로 클래스, 인터페이스 또는 메서드 이름을 특정한 컨텍스트 없이 단독으로 지정할 때 사용된다. 1. 단순 이름 (unqualified name)단순 이름은 패키지나 클래스의 경로 정보를 포함하지 않은, 그 자체로만 존재하는 이름을 말한다. 예를 들어 java.util.List 클래스에서 List는 단순 이름이다.클래스 java.uti;.ArrayList에서 ArrayList가 단순 이름이다.클래스 com.example.MyClass에서 MyClass가 단순 이름이다.2. 완전한 이름 / 정식 이름 (Qualified Name)완전한 이름은 클래스나 인터페이스의 패키지 경로를 포함..
https://sundaland.tistory.com/73 인터페이스가 특정 클래스만 상속하거나 구현할 수 있도락 제한하는 기능을 제공한다. 이를 통해 인터페이스를 상속하거나 구현할 수 있는 클래스들을 명시적으로 지정함으로써, 보다 강력한 캡슐화와 제어를 가능하게 한다. 1. 제한된 상속sealed로 선언된 인터페이스는 premits 키워드를 사용하여 상속이나 구현할 수 있는 클래스 또는 인터페이스를 명시한다.sealed interface를 구현할 수 있는 클래스들은 반드시 같은 모듈 또는 패키지에 있어야 하며, 명시적으로 상속을 허용한 클래스만 가능하다.2. 하위 클래스의 종류final : 더 이상 다른 클래스에서 상속할 수 없는 클래스이다.sealed : 추가적인 하위 클래스를 제한할 수 있는 클래..
https://sundaland.tistory.com/63 타입 안전한 프록시 객체란 프로그래밍에서 타입 시스템을 활용하여 컴파일 타임에 오류를 방지하고, 런타임에 예측하지 못한 예외나 오류가 발생하지 않도록 보장하는 프록시 객체를 의미한다. 프록시 객체프록시 객체는 원래 객체에 대한 대리 역할을 하는 객체이다. 이는 주로 원래 객체의 메서드를 호출할 때 추가적인 작업을 수행하거나, 원래 객체에 대한 접근을 제어하기 위해 사용된다.예를 들어 로깅, 접근 제어, 트랜잭션 관리 등을 프록시 객체에서 처리할 수 있다.타입 안전타입 안정성은 코드가 지정된 데이터 타입들에 맞게 작성되어, 잘못된 타입의 데이터가 사용될 가능성을 제거하는 것을 말한다. 이는 주로 컴파일 타임에 보장된다.타입 안정성이 보장되면, 프로..
https://sundaland.tistory.com/64 인코딩이라는 개념을 사용하는 이유는 다이나믹 프록시에서 메서드 호출이 단순히 다른 객체로 전달되는 것이 아니라, 호출된 메서드와 아규먼트들이 일종의 데이터로 변환 (또는 인코딩)되어 전달되기 때문이다. 이 과정을 통해 메서드 호출에 대한 상세한 정보가 포함된 java.lang.reflect.Method 객체와 아규먼트들이 Object[ ] 배열로 표현되어, Invocation Handler에 전달될 수 있게 된다.메스드 호출의 구조화 : 메서드의 이름, 파라미터 타입, 리턴 타입, 아규먼트 등의 정보는 단순한 값이 아니라, 복잡한 구조로 이루어진 데이터이다. 이 정보를 java.lang.reflect.Method 객체와 Object[ ] 배열로 ..
https://sundaland.tistory.com/301[ ▶ Constructors ]생성자는 클래스의 인스턴스인 객체를 생성할 때 사용된다. 일반적으로 메서드가 호출되거나 필드에 접근되기 전에 클래스 초기화에 필요한 작업을 수행한다. 생성자는 절대 상속되지 않는다. 메서드와 유사하게, 리플렉션은 클래스의 생성자를 발견하고 검색하며, 제어자, 파라미터, 어노테이션, throw 예외와 같은 선언 정보를 얻기 위한 API를 제공한다. 또한 지정된 생성자를 사용하여 클래스의 새 인스턴스를 생성할 수도 있다. 생성자를 다룰 때 사용하는 주요 클래스는 Class와 java.lang.reflect.Constructor이다. [ ▷ Finding Constructors ]생성자 선언에는 이름, 제어자, 파라미터..
https://sundaland.tistory.com/300[ ▶ Method ]메서드에는 호출될 수 있는 실행 가능한 코드가 들어있다. 메서드는 상속되고 넌-리플렉티브한 코드에서는 오버로딩, 오버라이딩, 하이딩 (Hiding)와 같은 동작이 컴파일러에 의해 적용된다. 반면 리플렉티브한 코드는 슈퍼클래스를 고려하지 않고도 메서드 선택을 특정 클래스로 제한할 수 있다. 슈퍼클래스 메서드에 액세스할 수 있지만 메서드를 선언한 클래스를 확인할 수 있다, 이는 리플렉션 없이는 프로그래밍 방식으로 발견하는 것이 불가능하며 많은 미묘한 버그의 원인이 된다. java.lang.reflect.Method 클래스는 메서드의 제어자, 리턴 타입, 파라미터, 어노테이션 및 throw된 예외에 대한 정보를 액세스하는 API를..