자바 고급 용법 의 주해 와 반사 강의

9574 단어 자바주해반사
머리말
반사 와 주 해 는 자바 에서 고급 용법 에 치 우 쳐 있 으 며,일반적으로 각종 프레임 워 크 에서 광범 위 하 게 응용 되 고 있 으 며,문장 은 간단하게 반사 와 주해 의 용법 을 소개 하 며,당신 의 업무 학습 에 어느 정도 도움 이 되 기 를 바 랍 니 다.
자바 주석
주해
자바 주석,즉 Annotation 은 자바 5 부터 도입 한 신기 술 입 니 다.
Annotation 의 역할:
4.567917.절차 자체 가 아니 라 절차 에 대해 설명 할 수 있다.
다른 프로그램(컴 파일 러 등)에서 읽 을 수 있 습 니 다Annotation 형식:
코드 에@주석 이름 으로 존재 하 는 주 해 는 Suppress Warnings(value="unchecked")와 같은 수 치 를 추가 할 수 있 습 니 다Annotation 은 안에서 사용 하나 요?
  • package,class,method,filed 등에 추가 할 수 있 습 니 다.그들 에 게 추가 적 인 보조 정 보 를 추가 한 것 과 같 습 니 다.우 리 는 반사 체제 프로 그래 밍 을 통 해 이러한 메타 데이터 에 대한 접근 을 실현 할 수 있 습 니 다
  • 원 주해
    원 주해 의 역할 은 다른 주 해 를 주석 하 는 것 입 니 다.자바 는 4 개의 표준 meta-annotation 유형 을 정의 하여 다른 annotation 유형 에 대해 설명 하 는 데 사 용 됩 니 다.
    이 유형 과 지원 하 는 종 류 는 자바.lang.annotation 패키지 에서 찾 을 수 있 습 니 다(@Target,@Retention,@Documented,@Inherited)
  • @Target:사용 범 위 를 설명 하 는 데 사 용 됩 니 다(주 해 는 어디에서 사용 합 니까?)
  • 4
  • @Retetion:이 주석 정 보 를 어느 단계 에서 보증 해 야 하 는 지 표시 합 니 다.주석 의 수명 주기(source@Document:영문 은 문서 라 는 뜻 입 니 다.주해 에 있 는 요 소 를 자바 doc 에 포함 시 키 는 역할 을 합 니 다
  • 4
  • @Inherited:주 해 된 주 해 는 부 류 를 수식 했다.만약 에 그의 자 류 가 다른 주해 에 의 해 수식 되 지 않 았 다 면 그의 자 류 도 부 류 의 주 해 를 계승 했다
  • 사용자 정의 주석
    @interface 사용자 정의 주석 을 사용 할 때 자바.lang.annotation.annotation 인 터 페 이 스 를 자동 으로 계승 합 니 다.
    
    public class Test03 {
        //        ,       ,        
        @Myannotation2(name = "aj",schloos = {"    "})
        public void test(){
    
        }
    
        @MyAnnotation3("")
        public void test2(){
    
        }
    }
    
    @Target({ElementType.METHOD,ElementType.TYPE})
    @Retention(RetentionPolicy.RUNTIME)
    @interface Myannotation2{
        //      ,    +   
        String name() default  "";
    
        int age() default  0;
    
        //      -1      
        int id() default -1;
    
        String[] schloos() ;
    }
    
    @Target({ElementType.METHOD,ElementType.TYPE})
    @Retention(RetentionPolicy.RUNTIME)
    @interface  MyAnnotation3{
    
        String value();
    }
    코드 에 주 해 를 넣 는 것 은 사실 이렇게 많은 것 입 니 다.관건 은 우리 가 주 해 를 어떻게 읽 느 냐 입 니 다.이것 은 반사 가 필요 합 니 다.다음은 자바 반 사 를 중점적으로 소개 합 니 다.
    자바 반사
    반 사 는 자바 가 동적 언어 로 여 겨 지 는 관건 이다.반사 체 제 는 프로그램 이 실행 기간 에 Reflection API 를 통 해 어떠한 내부 정 보 를 얻 을 수 있 고 임 의 대상 내부 익숙 함 과 방법 을 직접 조작 할 수 있다.
    
    Class c = Class.forName("java.lang.String")
    
    클래스 를 불 러 온 후 메모 리 를 쌓 는 방법 구역 에 클래스 형식의 대상(클래스 는 클래스 대상 만 있 음)이 생 겼 습 니 다.이 대상 은 완전한 클래스 의 구조 정 보 를 포함 하고 있 습 니 다.우 리 는 이 대상 을 통 해 유형의 구 조 를 볼 수 있다.이 대상 은 마치 거울 과 같 아서 이 거울 을 통 해 이런 구 조 를 볼 수 있 기 때문에 우 리 는 반사 라 고 부른다.

    클래스 클래스
    각 클래스 의 경우 JRE 는 변 하지 않 는 Class 유형의 대상 을 보존 하고 하나의 Class 대상 은 특정한 구조 에 관 한 정 보 를 포함한다.
    클래스 자체 도 클래스클래스 대상 은 시스템 구축 대상4
  • 하나의 로 딩 클래스 는 jvm 에서 하나의 CLass 인 스 턴 스 만 있 습 니 다
  • 하나의 Class 대상 은 jvm 에 불 러 온.class 파일 입 니 다
  • 4.567917.각 유형의 인 스 턴 스 는 자신 이 어떤 Class 인 스 턴 스 로 생 성 되 었 는 지 기억 합 니 다
  • Class 를 통 해 한 가지 유형의 모든 로 딩 된 구 조 를 완전 하 게 얻 을 수 있 습 니 다
  • Class 류 는 Reflection 의 근원 입 니 다.동적 으로 불 러 오고 실행 하고 싶 은 모든 클래스 에 대해 해당 하 는 Class 대상 을 먼저 얻 을 수 있 습 니 다.
  • Class 클래스 의 상용 방법
    반사 획득 대상
    
    public class Test02 {
        public static void main(String[] args) throws ClassNotFoundException {
            Person person = new Student();
            System.out.println("    "+person.name);
    
            //      
            Class c1 = person.getClass();
            System.out.println(c1.hashCode());
    
            //  forname  
            Class c2 = Class.forName("reflection.Student");
            System.out.println(c2.hashCode());
    
            //      
            Class c3 = Student.class;
            System.out.println(c3.hashCode());
    
            //      
            Class c4 = c1.getSuperclass();
            System.out.println(c4);
        }
    }
    
     
    
    @Data
    class Person{
        public String name;
        public int age;
    }
    
    
    class Student extends  Person{
        public Student(){
            this.name = "  ";
        }
    }
    
    class Teacher extends  Person{
        public Teacher(){
            this.name = "  ";
        }
    }
    
    
    반사 조작 방법,속성
    
    public class Test03 {
        public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException, NoSuchFieldException {
            Class c1 = Class.forName("reflection.Student");
    
            Student student = (Student) c1.newInstance();
            System.out.println(student.getName());
    
            //         
            Method setName = c1.getDeclaredMethod("setName", String.class);
            setName.invoke(student, "zhangshan");
            System.out.println(student.getName());
    
    
            Student student1 = (Student) c1.newInstance();
            Field name = c1.getDeclaredField("name");
            //            ,             ,setAccessible(true)
            name.setAccessible(true);
            name.set(student1,"lisi");
            System.out.println(student1.getName());
    
        }
    }
    
    
    성능 검사
    
    public class Test04 {
    
        public static void test01(){
            User user = new User();
            long startTime = System.currentTimeMillis();
    
            for (int i = 0; i <1000000000 ; i++) {
                user.getName();
            }
            long endTime = System.currentTimeMillis();
    
            System.out.println(endTime - startTime +"ms");
        }
    
    
        public static void test02() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
            User user = new User();
            long startTime = System.currentTimeMillis();
    
            Class c1 = user.getClass();
            Method getName = c1.getDeclaredMethod("getName", null);
    
            for (int i = 0; i <1000000000 ; i++) {
                getName.invoke(user, null);
            }
            long endTime = System.currentTimeMillis();
    
            System.out.println(endTime - startTime +"ms");
        }
    
    
        public static void test03() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
            User user = new User();
            long startTime = System.currentTimeMillis();
    
            Class c1 = user.getClass();
            Method getName = c1.getDeclaredMethod("getName", null);
            getName.setAccessible(true);
    
            for (int i = 0; i <1000000000 ; i++) {
                getName.invoke(user, null);
            }
            long endTime = System.currentTimeMillis();
    
            System.out.println(endTime - startTime +"ms");
        }
    
        public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException {
            test01();
            test02();
            test03();
        }
    }
    
    

    반사 조작 주해
    
    public class Test05 {
    
        public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException {
            Class<?> c1 = Class.forName("reflection.Customer");
    
            //         
            Annotation[] annotations = c1.getAnnotations();
            for (Annotation annotation:annotations){
                System.out.println(annotation);
            }
    
            //       
            TableAnnotation annotation = c1.getAnnotation(TableAnnotation.class);
            System.out.println(annotation.value());
    
            //       
            Field id = c1.getDeclaredField("id");
            FiledAnnotation annotation1 = id.getAnnotation(FiledAnnotation.class);
            System.out.println(annotation1.columnName());
            System.out.println(annotation1.length());
            System.out.println(annotation1.type());
    
    
        }
    }
    
    
    //   
    @Target(ElementType.TYPE)
    @Retention(RetentionPolicy.RUNTIME)
    @interface TableAnnotation{
        String value();
    }
    
    
    @Data
    @TableAnnotation("db_customer")
    class Customer {
    
        @FiledAnnotation(columnName="id",type = "Long",length =10)
        private Long id;
    
        @FiledAnnotation(columnName="age",type = "int",length =10)
        private int age;
    
        @FiledAnnotation(columnName="name",type = "String",length =10)
        private String name;
    
    
    }
    
    
    //    
    @Target(ElementType.FIELD)
    @Retention(RetentionPolicy.RUNTIME)
    @interface FiledAnnotation{
        String columnName();
    
        String type();
    
        int length();
    }
    
    총결산
    자바 고급 용법 의 주해 와 반사 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 자바 주해 와 반사 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!

    좋은 웹페이지 즐겨찾기