한 편의 글 이 너 를 데 리 고 JAVA 반 사 를 해결 해 줄 게.

8215 단어 JAVA반사
1.반사 적 개념
1.개념
반사 란 운행 상태 에서 임의의 클래스 에 대해 이 클래스 의 모든 속성 과 방법 을 알 수 있 고 임의의 대상 에 대해 임의의 방법 을 호출 할 수 있다 는 것 을 말한다.이러한 동적 으로 정 보 를 얻 고 대상 방법 을 동적 으로 호출 하 는 기능 을 자바 언어의 반사 메커니즘 이 라 고 합 니 다.반사 가 강하 고 장점 도 있 고 단점 도 있다.
장점:유연성 이 높다.반 사 는 동적 컴 파일 에 속 하기 때문에 실행 할 때 만 동적 생 성&대상 인 스 턴 스 를 가 져 옵 니 다.
단점:집행 효율 이 낮다.
2.바이트 파일 대상 가 져 오 는 방법
2.1 메타 데이터 의 개념
메타 데이터(metadata):메타 데 이 터 는 클래스 를 설명 하 는 데 사용 되 는 데 이 터 를 말 합 니 다.바로 class 의 코드 데이터 입 니 다.모든 class 파일 을 가상 컴퓨터 에 불 러 오 면 class 대상 으로 구 축 됩 니 다.class 대상 은 어떤 것들 이 있 는 지 설명 합 니 다.모두 가 알 고 있 는 실현 인터페이스,계승 하 는 추상 류,구성원 변수,클래스 변수,구성원 방법,클래스 방법,정적 방법 등 이 있 습 니 다.이 class 대상 은 메타 데이터 입 니 다.
클래스 클래스:한 클래스 를 대표 합 니 다
  • Field 류:대표 적 인 구성원 변수(구성원 변 수 는 클래스 의 속성 이 라 고도 함)
  • Method 류:대표 적 인 방법
  • 4.567917.Constructor 류:대표 적 인 구조 방법图片
    2.2 클 라 스 대상 을 가 져 오 는 방법
  • 대상 을 통 해 얻 을 수 있 습 니 다.모든 대상 이 class 대상 과 관련 되 어야 하기 때 문 입 니 다
  • 클래스 대상 을 통 해 직접 획득클래스 로 더 를 통 해 얻 을 수 있 습 니 다.클래스 로 더 가 class 파일 을 읽 으 면 class 대상 으로 돌아 가기 때 문 입 니 다반사 대상
    
    package org.pdool.reflect;
     
    /**
    * @author   
    */
    public class Npc {
      //   field
      public static int NPC_TYPE_1 = 1;
      //       
      private int npcType;
      //       
      public String name;
      //       
      public Npc() {
      }
      //       
      public Npc(int npcType, String name) {
          this.npcType = npcType;
          this.name = name;
      }
     
      public int getNpcType() {
          return npcType;
      }
     
      public void setNpcType(int npcType) {
          this.npcType = npcType;
      }
     
      public String getName() {
          return name;
      }
     
      public void setName(String name) {
          this.name = name;
      }
      //     
      public static void sayHello(String word){
          System.out.println("hello " + word);
      }
    }
    반사 클 라 스 를 가 져 오 는 세 가지 방식
    
    package org.pdool.reflect;
     
    /**
    * @author   
    */
    public class ClazzTest {
       public static void main(String[] args) {
           //       Class  
           Npc npc1 = new Npc();//  new     Npc  ,  Class  。
           Class npcClazz1 = npc1.getClass();//  Class  
           System.out.println(npcClazz1.getName());
     
           //       Class  
           Class npcClazz2 = Npc.class;
           System.out.println(npcClazz1 == npcClazz2);//          Class                 
     
           //       Class  
           try {
               Class npcClazz3 = Class.forName("org.pdool.reflect.Npc");//             ,         ,  .  
               System.out.println(npcClazz3 == npcClazz2);//               Class  
          } catch (ClassNotFoundException e) {
               e.printStackTrace();
          }
     
      }
    }
    1.접근 권한
    반사 메커니즘 의 기본 행 위 는 자바 의 접근 제어 에 제한 을 받 아 setAccessible 을 통 해 제어 할 수 있 습 니 다.
    
    //            
    static void setAccessible(AccessibleObject[] array, boolean flag)  
    2.획득 방법
    图片
    2.1 정적 접근 방법
    
    public static void main(String[] args) throws NoSuchMethodException,InvocationTargetException, IllegalAccessException {
           Npc npc = new Npc(1, "  ・  ");
           Class npcClazz = Npc.class;
           //          ,           class  ,          ,       
           Method sayHello = npcClazz.getMethod("sayHello", String.class);
           sayHello.invoke(npc, "world");
      }
    2.2 액세스 클래스 방법
    
          Npc npc = new Npc(1, "  ・  ");
          System.out.println(npc.getName());
          Class npcClazz = Npc.class;
          //          ,           class  ,          ,       
          Method sayHello = npcClazz.getMethod("setName", String.class);
          sayHello.invoke(npc, "world");
          System.out.println(npc.getName());
     3.필드 가 져 오기,필드 값 읽 기
    图片
    
           Npc npc = new Npc(1, "  ・  ");
           Class npcClazz = Npc.class;
           //     ,      
           Field field = npcClazz.getField("name");
           field.setAccessible(true);
           System.out.println( field.get(npc));
    4.실현 되 는 인터페이스 가 져 오기
    图片
    5.구조 함수 가 져 오기,인 스 턴 스 생 성
    图片
    
        Class npcClazz = Npc.class;
                   Constructor declaredConstructor = npcClazz.getDeclaredConstructor(int.class,String.class);
           Npc npc = (Npc) declaredConstructor.newInstance(1, "  ");
           System.out.println(npc.getName());
    6.상속 한 부류 획득
    
    Class npcClazz = Npc.class;
    Class superclass = npcClazz.getSuperclass();
    System.out.println(superclass.getName());
    7.주석 가 져 오기
    
    Class npcClazz = Npc.class;
           Annotation[] annotations = npcClazz.getAnnotations();
    //      
           for (Annotation annotation : annotations) {
               System.out.println(annotation.getClass().getName());
          }
    4.반사 사례
    메타 데 이 터 를 가 져 오 는 것 은 최종 목적 이 아 닙 니 다.저희 의 최종 목적 은 실행 할 때'접근 클래스'를 호출 하 는 것 입 니 다.너무 많은 말 을 했 습 니까?아니면 예 를 들 어 Spring 의 IOC 가 어떻게 이 루어 졌 는 지 아 세 요?
    프로 세 스:
    1.Spring 은 프로젝트 시작 시간 에 xml 에 설 정 된 bean 의 경 로 를 읽 습 니 다.
    2.그리고 class.forName 을 통 해 클래스 로 더 를 읽 습 니 다.
    3.그리고 반사 로 모든 bean 인 스 턴 스 를 만 들 고 용기 에 저장 하 며 용 기 를 시작 한 후,
    4.프로젝트 에서 bean 대상 을 직접 얻 을 수 있 습 니 다.
    xml 읽 기 가 귀 찮 기 때문에 property 로 대체 합 니 다.모두 가 사상 을 체득 하면 된다.
    
    package org.pdool.reflect;
     
    import java.io.IOException;
    import java.io.InputStream;
    import java.lang.annotation.Annotation;
    import java.lang.reflect.Constructor;
    import java.lang.reflect.Field;
    import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;
    import java.util.HashMap;
    import java.util.Map;
    import java.util.Properties;
    import java.util.Set;
     
    /**
    * @author   
    */
    public class ClazzTest {
      public static void main(String[] args){
          try {
              Map<String,Object> container = new HashMap<>();
              //1.    
              InputStream in = ClazzTest.class.getResourceAsStream("/beans.properties");
              Properties property = new Properties();
              property.load(in);
              //2.      
              Set<Object> keySet = property.keySet();
              for (Object key : keySet) {
                  // 2.1        
                  String classStr = (String) property.get(key);
                  // 2.2   class     
                  Class<?> beanClazz = Class.forName(classStr);
                  // 2.3          
                  Constructor<?> declaredConstructor = beanClazz.getDeclaredConstructor();
                  // 2.4     
                  Object o = declaredConstructor.newInstance();
                  container.put((String) key,o);
              }
              // 3.    
              Npc npc = (Npc) container.get("npc");
              System.out.println(npc == null);
          } catch (Exception e) {
              e.printStackTrace();
          }
      }
    }
    5.총화
    자바 반사 체 제 를 사용 할 때 주요 절 차 는 다음 과 같다.
    대상 형식의 Class 대상 가 져 오기
    Class 대상 을 통 해 Constructor 클래스 대상,Method 클래스 대상 또는 Field 클래스 대상 을 각각 가 져 옵 니 다.
    Constructor 클래스 대상,Method 클래스 대상&Field 클래스 대상 을 통 해 클래스 의 구조 함수,방법&속성의 구체 적 인 정 보 를 얻 고 후속 작업 을 진행 합 니 다.
    이 글 은 여기까지 입 니 다.당신 에 게 도움 을 줄 수 있 기 를 바 랍 니 다.또한 당신 이 우리 의 더 많은 내용 에 관심 을 가 져 주 실 수 있 기 를 바 랍 니 다!

    좋은 웹페이지 즐겨찾기