자바 중 반사 상해

7715 단어 자바반사
읽 기 목록
  • Java 반사 API
  • 반사 로 인 스 턴 스 대상 만 들 기
  • 반사 호출 사유 방법
  • javap 도구
  • 참고 자료
  • Java 반사 API
    자바 반 사 는 실행 상태 에서 클래스 의 속성 과 방법 을 얻 거나 클래스 가 실 행 될 때의 행 위 를 수정 할 수 있 는 과정 을 말한다.
    java.lang.class 클래스 는 메타 데 이 터 를 가 져 오고 검사 하 며 클래스 가 실 행 될 때의 행동 을 바 꾸 는 데 많은 방법 을 제공 합 니 다.
    자바 의 반 사 는 주로 자바.lang 과 자바.lang.reflect 패키지 의 클래스 와 관련된다.
    반사 응용 장면 예
  • IDE,예 를 들 어 Eclipse,MyEclipse,NetBeans 등;
  • 디 버 거;
  • 테스트 도구 등;
  • 각 프레임 워 크,spring,hibenate 등;
  • java.lang.Class 클래스
    java.lang.Class 는 주로 다음 과 같은 두 가지 기능 을 제공 합 니 다.
  • 실행 기간 클래스 의 메타 데이터 에 접근 하 는 방법 을 제공 합 니 다.
  • 클래스 의 운행 시 행 위 를 검사 하고 수정 하 는 방법 을 제공한다.
  • java.lang.class 클래스 상용 방법
    Method
    Description
    1) public String getName()
    클래스 이름 되 돌리 기
    2) public static Class forName(String className)throws ClassNotFoundException
    클래스 를 불 러 오고 Class 대상 을 되 돌려 줍 니 다.
    3) public Object newInstance()throws InstantiationException,IllegalAccessException
    인 스 턴 스 대상 만 들 기
    4) public boolean isInterface()
    인터페이스 여 부 를 판단 하 다.
    5) public boolean isArray()
    배열 여 부 를 판단 하 다.
    6) public boolean isPrimitive()
    원본 데이터 형식 인지 판단 하기
    7) public Class getSuperclass()
    부모 클래스 참조 되 돌리 기
    8) public Field[] getDeclaredFields()throws SecurityException
    클래스 의 구성원 속성 필드 배열 을 되 돌려 줍 니 다.
    9) public Method[] getDeclaredMethods()throws SecurityException
    클래스 를 되 돌려 주 는 방법 배열
    10) public Constructor[] getDeclaredConstructors()throws SecurityException
    클래스 의 구조 방법 배열 을 되 돌려 줍 니 다.
    11) public Method getDeclaredMethod(String name,Class[] parameterTypes)throws NoSuchMethodException,SecurityException
    클래스 에서 지정 한 매개 변수 형식 을 되 돌려 주 는 방법
    어떻게 Class 대상 을 가 져 옵 니까?
    세 가지 방법 이 있 는데 다음 과 같다.
  • Class 류 의 forName()방법,동적 로드,실행 시 클래스 를 불 러 오고 클래스 의 정적 초기 화
  • 대상 의 getClass()방법,정적 로드(컴 파일 시 로드 됨)
  • .class 문법,정적 로드(컴 파일 시 불 러 왔 음)
  • forName()방법 예시
    동적 로 딩 에 사용 할 수 있 습 니 다.클래스 의 전체 제한 이름 을 알 고 있 을 때 이 방식 을 사용 할 수 있 습 니 다.원본 데이터 형식 이 이 방법 에 적용 되 지 않도록 주의 하 십시오.
    
    package tmp;
    class Simple
    {
    }
    public class Test
    {
     public static void main(String args[]) throws ClassNotFoundException
     {
     Class<?> c = Class.forName("tmp.Simple");
     System.out.println(c.getName());
     System.out.println(c.getSimpleName());
     }
    }
    
    
    tmp.Simple
    Simple
    getClass()방법 예시:
    인 스 턴 스 대상 에서 Class 대상 가 져 오기
    
    package tmp;
    class Simple
    {
    }
    public class Test
    {
     void printName(Object obj)
     {
     }
     public static void main(String args[])
     {
     Simple s = new Simple();
     Class<? extends Object> c = s.getClass();
     System.out.println(c.getName());
     System.out.println(c.getSimpleName());
     }
    }
    
    
    tmp.Simple
    Simple
    .class 문법 예시
    클래스 이름 에 도 사용 할 수 있 고 원시 데이터 형식 에 도 사용 할 수 있 습 니 다.다음 과 같 습 니 다.
    
    package tmp;
    public class Test
    {
     public static void main(String args[])
     {
     Class<Boolean> c = boolean.class;
     System.out.println(c.getName());
     Class<Test> c2 = Test.class;
     System.out.println(c2.getName());
     }
    }
    
    
    boolean
    tmp.Test
    Class 대상 에 대응 하 는 유형 판단
    다음 방법 은 Class 대상 이 대응 하 는 유형 을 판단 하 는 데 사용 할 수 있 습 니 다.
    1) public boolean isInterface(): 인터페이스 대응 여부
    2) public boolean isArray(): 대응 하 는 배열 여부
    3) public boolean isPrimitive(): 원본 데이터 형식 에 대응 할 지 여부
    코드 예제:
    
    package tmp;
    class Simple
    {
    }
    interface My
    {
    }
    public class Test
    {
     public static void main(String args[])
     {
     try
     {
     Class<?> c = Class.forName("tmp.Simple");
     System.out.println(c.isInterface());
     Class<?> c2 = Class.forName("tmp.My");
     System.out.println(c2.isInterface());
     }
     catch (Exception e)
     {
     System.out.println(e);
     }
     }
    }
    
    
    false
    true
    반사 로 인 스 턴 스 대상 만 들 기
    두 가지 방법 이 있 는데 다음 과 같다.
  • Class 대상 의 new Instance()방법 을 통 해 만 들 수 있 습 니 다.이 방식 은 무 참 구조 방법 만 호출 할 수 있 습 니 다.
  • Constructor 대상 의 new Instance()방법 을 통 해 만 들 었 는데 이런 방식 은 참여 구조 방법 에 적용 되 고 단일 모델 을 파괴 하여 사유 구조 방법 을 호출 할 수 있다.
  • 그래서 통상 적 으로 두 번 째 방식 은 첫 번 째 사용 범위 보다 더 넓다.
    Class 대상 호출 newInstance()방법 예시
    
    package tmp;
    class Simple
    {
     void message()
     {
     System.out.println("Hello Java");
     }
    }
    public class Test
    {
     public static void main(String args[])
     {
     try
     {
     Class<?> c = Class.forName("tmp.Simple");
     Simple s = (Simple) c.newInstance();
     s.message();
     }
     catch (Exception e)
     {
     System.out.println(e);
     }
     }
    }
    
    Hello JavaConstructor 대상 호출 newInstance()방법 예시
    이 곳 은 전 송 된 매개 변수의 유형 에 따라 지 정 된 구조 방법 을 얻 을 수 있 고 구조 방법의 접근 권한 제한 도 바 꿀 수 있 음 을 주의 하 십시오.
    
    package tmp;
    import java.lang.reflect.Constructor;
    class Simple
    {
     private String msg;
     void message()
     {
     System.out.println("Hello Java," + msg);
     }
     private Simple(String s){
     this.msg = s;
     }
    }
    public class Test
    {
     public static void main(String args[])
     {
     try
     {
     Class<?> c = Class.forName("tmp.Simple");
     Constructor<?> con = c.getDeclaredConstructor(String.class);
     con.setAccessible(true);
     Simple s = (Simple) con.newInstance("...");
     s.message();
     }
     catch (Exception e)
     {
     System.out.println(e);
     }
     }
    }
    
    Hello Java,...반사 를 통 해 사유 방법 을 호출 하 다
    반 사 를 통 해 우 리 는 다른 종류의 개인 적 인 방법 을 호출 할 수 있 습 니 다.주로 자바.lang.class 와 자바.lang.reflect.Method 류 와 관련 됩 니 다.
    그 중에서 주로 Method 류 의 setAccessible 방법 과 invoke 방법 을 사 용 했 고 전 자 는 방문 권한 을 수정 하고 후 자 는 호출 방법 을 사용 했다.
    참조 사유 방법 예제 호출:
    
    package tmp;
    import java.lang.reflect.Method;
    class A
    {
     private void cube(int n)
     {
     System.out.println(n * n * n);
     }
    }
    class Test
    {
     public static void main(String args[]) throws Exception
     {
     Class<A> c = A.class;
     Object obj = c.newInstance();
     Method m = c.getDeclaredMethod("cube", new Class[]{ int.class });
     m.setAccessible(true);
     m.invoke(obj, 4);
     }
    }
    
    javap 도구 에 대하 여
    자바 p 명령 을 사용 하면 자바 의 바이트 코드 파일 을 역 어 셈 블 리 하여 class 파일 의 필드 속성,구조 방법,일반 방법 정 보 를 보 여 줍 니 다.
    사용 설명:

    javap java.lang.Object 예제
    javap-c 테스트 예제:

    간단 한 Test 클래스 를 쓰 십시오.다음 과 같 습 니 다.
    
    package tmp;
    class Simple
    {
    }
    public class Test
    {
     public static void main(String args[])
     {
     System.out.println("Hello");
     }
    }
    
    javap-c Test 입력:

    참고 자료
    기본적으로 번역 에 속 하여 작은 부분 을 수정 하 였 다.
    http://www.javatpoint.com/java-reflection
    이상 은 본 고의 모든 내용 입 니 다.본 고의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 도움 이 되 기 를 바 랍 니 다.또한 저 희 를 많이 지지 해 주시 기 바 랍 니 다!

    좋은 웹페이지 즐겨찾기