자바 반사 기술 총화

13841 단어 Java자바반사
반사
간단 한 소개
  • 운행 상태 에서 임의의 클래스 에 대해 이 클래스 의 모든 속성 과 방법 을 알 수 있다.임의의 대상 에 대해 서 는 임의의 방법 과 속성 을 호출 할 수 있다
  • .
  • 정적 언어: 실행 할 때 구 조 를 바 꿀 수 있 는 언어
  • 정적 언어: 실행 시 구조 가 변 하지 않 음
  • 클래스 를 불 러 온 후에 메모리 에 있 는 방법 구역 에 Class 형식의 대상 (한 클래스 에 하나의 Class 대상 만 있 음) 이 생 겼 습 니 다. 이 대상 은 완전한 클래스 의 구조 정 보 를 포함 합 니 다.우 리 는 이 대상 을 통 해 유형의 구 조 를 볼 수 있다.이 상 대 는 마치 거울 처럼 이 거울 을 통 해 유형 구 조 를 볼 수 있다.그래서 우 리 는 반사 라 고 부른다
  • 클래스 대상 만 들 기
    @Test
    public void test() throws ClassNotFoundException {
        //    :   .class
        Class<Book> bookClass = Book.class;
        //    :   .getClass()
        Class<? extends Book> aClass = new Book().getClass();
        //    :        Class  
        Class<?> aClass1 = Class.forName("com.demo07.Book");
    }
    

    클래스 로드
  • 로드:
  • class 파일 바이트 코드 내용 을 메모리 에 불 러 오고 이 정적 데 이 터 를 방법 구역 의 실행 시 데이터 구조 로 변환 한 다음 에 이 종 류 를 대표 하 는 java. lang. class 대상 을 생 성 합 니 다.

  • 링크:
  • 검증: 자바 류 의 바 이 너 리 코드 를 JVM 의 실행 상태 에 통합 하 는 과정
  • 준비: 클래스 변수 (static) 를 메모리 에 정식으로 할당 하고 클래스 변수의 기본 초기 값 을 설정 하 는 단계 입 니 다. 이 메모리 들 은 모두 방법 에 따라 분 배 됩 니 다.
  • 해석: 가상 컴퓨터 상수 탱크 안의 기호 참조 (상수 명) 를 직접 참조 (주소) 로 바 꾸 는 과정
  • 초기 화:
  • 클래스 구조 기 () 방법 을 실행 하 는 과정 에서 클래스 구조 기 () 방법 은 컴 파일 러 가 클래스 의 모든 변수의 할당 동작 과 정적 코드 블록 중의 문 구 를 자동 으로 수집 하여 생 긴 것 이다.(류 구조 기 는 구조 류 정보의 것 이지 이런 대상 을 구성 하 는 구조 기 가 아니다)
  • 한 클래스 를 초기 화 할 때 부모 클래스 가 초기 화 되 지 않 은 것 을 발견 하면 부모 클래스 의 초기 화
  • 를 먼저 촉발 해 야 합 니 다.
  • 가상 기 회 는 하나의 () 방법 이 다 중 스 레 드 환경 에서 정확 한 잠 금 과 동기 화
  • 를 보장 한다.

    클래스 초기 화
  • 클래스 의 주동 적 인 인용 (반드시 발생 하 는 클래스 의 초기 화):
  • 가상 컴퓨터 가 작 동 할 때 main 방법 이 있 는 클래스 를 초기 화 합 니 다
  • new 클래스 의 대상
  • 호출 클래스 의 정적 변수 (final 상수 제외) 와 정적 방법
  • 자바. lang. reflect 패키지 의 방법 으로 클래스 를 반사 호출 합 니 다
  • 클래스 를 초기 화 할 때 부모 클래스 가 초기 화 되 지 않 으 면 부모 클래스
  • 를 초기 화 합 니 다.
  • 클래스 의 수 동적 인용 (등 발생 클래스 의 초기 화)
  • 정적 도 메 인 에 접근 할 때 이 도 메 인 을 진정 으로 설명 하 는 클래스 만 초기 화 됩 니 다.예 를 들 어 하위 클래스 를 통 해 부모 클래스 의 정적 변 수 를 인용 하면 하위 클래스 가 초기 화 되 지 않 습 니 다
  • 데이터 정의 클래스 응용 을 통 해 이러한 초기 화 를 촉발 하지 않 습 니 다
  • 참조 상수 가 클래스 의 초기 화 를 촉발 하지 않 습 니 다 (상수 가 링크 단계 에서 호출 클래스 의 상수 탱크 에 저 장 됩 니 다)

  • 클래스 로 더
  • 역할:
  • class 파일 바이트 코드 내용 을 메모리 에 불 러 오고 이 정적 데 이 터 를 방법 구역 의 실행 시 데이터 구조 로 변환 한 다음 에 메모리 에 이 종 류 를 대표 하 는 java. lang. class 대상 을 생 성하 여 방법 구역 의 데이터 접근 입구
  • 클래스 캐 시:
  • 표준 자바 SE 클래스 로 더 는 요구 에 따라 클래스 를 찾 을 수 있 지만, 클래스 로 더 에 불 러 오 면 로드 (캐 시) 를 일정 시간 유지 하 겠 다 고 합 니 다
  • .

    클래스 의 런 타임 구조 가 져 오기
    @Test
    public void test3() throws Exception {
        //   class  
        Class<?> aClass = Class.forName("com.demo07.Book");
        //       
        Constructor<?> constructor = aClass.getDeclaredConstructor(String.class, Double.class);
        //   java      
        constructor.setAccessible(true);
        //     
        Book book = (Book) constructor.newInstance("    ", 45.0);
        System.out.println(book.toString());
    
        //         public     
        Field[] fields = aClass.getFields();
        //            
        Field[] declaredFields = aClass.getDeclaredFields();
        //             public     
        Method[] methods = aClass.getMethods();
        //          
        Method[] declaredMethods = aClass.getDeclaredMethods();
        //       
        Method setBookName = aClass.getDeclaredMethod("setBookName", String.class);
        setBookName.setAccessible(true);
        //     :     :    ,  
        setBookName.invoke(book, "    ");
        Method getBookName = aClass.getDeclaredMethod("getBookName");
        getBookName.setAccessible(true);
        System.out.println(getBookName.invoke(book));
    
        //         
        Table table = (Table) aClass.getAnnotation(Table.class);
        System.out.println(table.value());
        Field bookName = aClass.getDeclaredField("bookName");
        //           
        Colnum colnum = bookName.getAnnotation(Colnum.class);
        System.out.println(colnum.name());
        System.out.println(colnum.type());
        System.out.println(colnum.lenght());
    }
    

    좋은 웹페이지 즐겨찾기