자바 고급 특성의 반사

정의.
JAVA 반사 메커니즘 은 운행 상태 에서 임의의 종류 에 대해 이 종류의 모든 속성 과 방법 을 알 수 있다.임의의 대상 에 대해 서 는 임의의 방법 과 속성 을 호출 할 수 있 습 니 다.이러한 동적 으로 정 보 를 얻 고 대상 을 동적 으로 호출 하 는 방법 을 자바 언어의 반사 메커니즘 이 라 고 한다.
용도.
일상적인 제3자 응용 개발 과정 에서 특정한 구성원 변수,방법 또는 속성 이 개인 적 이거 나 시스템 응용 에 만 개방 되 는 경우 가 많다.이 럴 때 자바 의 반사 체 제 를 이용 하여 반사 로 필요 한 개인 구성원 이나 방법 을 얻 을 수 있다.물론 모든 것 이 반사 에 적합 한 것 은 아니다.그 전에 하나의 사례 를 만 나 반 사 를 통 해 얻 은 결 과 는 기대 와 맞지 않 는 다.원본 코드 를 읽 은 결과,층 층 이 호출 된 후에 최종 결 과 를 되 돌려 주 는 곳 에서 응용 권한 을 검증 한 결과,권한 이 없 는 응용 반환 값 은 의미 없 는 결 성 값 이 며,그렇지 않 으 면 실제 값 으로 돌아 가 사용자 의 프라이버시 를 보호 하 는 목적 을 가 집 니 다.
반사 메커니즘 의 상관 류
자바 반사 와 관련 된 종 류 는 다음 과 같 습 니 다.
유명무실 하 다
용도.
클래스 클래스
클래스 를 대표 하 는 실체,실행 중인 자바 응용 프로그램 에서 클래스 와 인 터 페 이 스 를 표시 합 니 다.
필드 클래스
대표 클래스 의 구성원 변수(구성원 변수 도 클래스 의 속성 이 라 고 함)
메 소 드 클래스
대표 적 방법
Constructor 클래스
대표 적 구조 방법
클래스 클래스
Class 대표 클래스 의 실 체 는 실행 중인 자바 응용 프로그램 에서 클래스 와 인 터 페 이 스 를 표시 합 니 다.이런 종류 에서 많은 유용 한 방법 을 제 공 했 는데,여기 서 그들 에 대한 간단 한 분류 에 대해 소개 한다.
클래스 획득 방법
방법.
용도.
asSubclass(Class clazz)
전달 하 는 클래스 의 대상 을 하위 클래스 를 대표 하 는 대상 으로 바꾸다.
Cast
대상 을 대표 클래스 나 인터페이스의 대상 으로 바꾸다
getClassLoader()
클래스 가 져 오기
getClasses()
하나의 배열 을 되 돌려 줍 니 다.배열 에는 이러한 종류의 모든 공공 클래스 와 인터페이스 류 의 대상 이 포함 되 어 있 습 니 다.
getDeclaredClasses()
이 클래스 의 모든 클래스 와 인터페이스 클래스 를 포함 하 는 배열 을 되 돌려 줍 니 다.
forName(String className)
클래스 이름 에 따라 클래스 의 대상 을 되 돌려 줍 니 다.
getName()
클래스 의 전체 경로 이름 가 져 오기
newInstance()
클래스 생 성 인 스 턴 스
getPackage()
획득 클래스 의 가방
getSimpleName()
클래스 이름 얻 기
getSuperclass()
현재 클래스 계승 부모 클래스 의 이름 획득
getInterfaces()
현재 클래스 가 실 현 된 클래스 나 인 터 페 이 스 를 가 져 옵 니 다.
클래스 속성 획득 방법
방법.
용도.
getAnnotation(ClassannotationClass)이 클래스 에서 매개 변수 형식 과 일치 하 는 공유 주석 대상 을 되 돌려 줍 니 다.getAnnotations()이 종류의 모든 공유 주석 대상 을 되 돌려 줍 니 다.getDeclaredAnnotation(Class annotationClass)
이 클래스 에서 매개 변수 형식 과 일치 하 는 모든 주석 대상 을 되 돌려 줍 니 다.
getDeclaredAnnotations()
이 종류의 모든 주석 대상 을 되 돌려 줍 니 다.
클래스 의 구조 기 에 관 한 방법 을 얻 습 니 다.
방법.
용도.
getConstructor(Class... parameterTypes)
이 클래스 에서 매개 변수 유형 과 일치 하 는 공유 구조 방법 을 얻 습 니 다.
getConstructors()
이런 종류의 모든 공유 구조 방법 을 얻다.
getDeclaredConstructor(Class... parameterTypes)
이 클래스 에서 매개 변수 형식 과 일치 하 는 구조 방법 을 얻 습 니 다.
getDeclaredConstructors()
이런 종류의 모든 구조 방법 을 얻다
클래스 에서 얻 는 방법
방법.
용도.
getMethod(String name, Class... parameterTypes)
이런 종류의 어떤 공유 방법 을 얻다.
getMethods()
이런 종류의 모든 공 유 를 얻 는 방법
getDeclaredMethod(String name, Class... parameterTypes)
이런 종류의 어떤 방법 을 얻다
getDeclaredMethods()
이 종류의 모든 방법 획득
클래스 중 기타 중요 한 방법
방법.
용도.
isAnnotation()
주석 형식 이면 true 로 돌아 갑 니 다.
isAnnotationPresent(Class annotationClass)
지정 한 형식 주석 형식 이면 true 로 돌아 갑 니 다.
isAnonymousClass()
익명 클래스 라면 true 로 돌아 갑 니 다.
isArray()
하나의 배열 클래스 라면 true 로 돌아 갑 니 다.
isEnum()
매 거 진 클래스 라면 true 로 돌아 갑 니 다.
isInstance(Object obj)
obj 가 이 클래스 의 인 스 턴 스 라면 true 로 돌아 갑 니 다.
isInterface()
인터페이스 클래스 라면 true 로 돌아 갑 니 다.
isLocalClass()
국부 클래스 라면 true 로 돌아 갑 니 다.
isMemberClass()
내부 클래스 라면 true 로 돌아 갑 니 다.
필드 클래스
Field 대표 클래스 의 구성원 변수(구성원 변수 도 클래스 의 속성 이 라 고 함).
방법.
용도.
equals(Object obj)
속성 이 obj 와 같 으 면 true 로 돌아 갑 니 다.
get(Object obj)
obj 에 대응 하 는 속성 값 획득
set(Object obj, Object value)
obj 에 대응 하 는 속성 값 설정
메 소 드 클래스
Method 대표 클래스 의 방법.
방법.
용도.
invoke(Object obj, Object... args)
object 대상 및 매개 변 수 를 전달 하여 해당 대상 에 대응 하 는 방법 을 호출 합 니 다.
Constructor 클래스
Constructor 대표 류 의 구조 방법.
방법.
용도.
newInstance(Object... initargs)
전달 하 는 매개 변수 에 따라 클래스 의 대상 을 만 듭 니 다.
예시
반사 적 인 사용 을 보 여주 기 위해 먼저 책 과 관련 된 model―Book.자바 를 구축 한 다음 에 반사 방법 으로 대상 을 만 들 고 사유 구조 방법 을 반사 하 며 사유 속성 을 반사 하고 사유 방법 을 반사 하 며 마지막 으로 비교적 복잡 한 반사 예 를 제시 하여 현재 ZenMode 와 꺼 진 Shutdown 을 얻 습 니 다.
반사 클래스 북 자바

public class Book{
  private final static String TAG = "BookTag";
 
  private String name;
  private String author;
 
  @Override
  public String toString() {
    return "Book{" +
        "name='" + name + '\'' +
        ", author='" + author + '\'' +
        '}';
  }
 
  public Book() {
  }
 
  private Book(String name, String author) {
    this.name = name;
    this.author = author;
  }
 
  public String getName() {
    return name;
  }
 
  public void setName(String name) {
    this.name = name;
  }
 
  public String getAuthor() {
    return author;
  }
 
  public void setAuthor(String author) {
    this.author = author;
  }
 
  private String declaredMethod(int index) {
    String string = null;
    switch (index) {
      case 0:
        string = "I am declaredMethod 1 !";
        break;
      case 1:
        string = "I am declaredMethod 2 !";
        break;
      default:
        string = "I am declaredMethod 1 !";
    }
 
    return string;
  }
}
반사 논리 패키지 ReflectClass.java

public class ReflectClass {
  private final static String TAG = "peter.log.ReflectClass";
 
  //     
  public static void reflectNewInstance() {
    try {
      Class<?> classBook = Class.forName("com.android.peter.reflectdemo.Book");
      Object objectBook = classBook.newInstance();
      Book book = (Book) objectBook;
      book.setName("Android    ");
      book.setAuthor("   ");
      Log.d(TAG,"reflectNewInstance book = " + book.toString());
    } catch (Exception ex) {
      ex.printStackTrace();
    }
  }
 
  //          
  public static void reflectPrivateConstructor() {
    try {
      Class<?> classBook = Class.forName("com.android.peter.reflectdemo.Book");
      Constructor<?> declaredConstructorBook = classBook.getDeclaredConstructor(String.class,String.class);
      declaredConstructorBook.setAccessible(true);
      Object objectBook = declaredConstructorBook.newInstance("Android      ","   ");
      Book book = (Book) objectBook;
      Log.d(TAG,"reflectPrivateConstructor book = " + book.toString());
    } catch (Exception ex) {
      ex.printStackTrace();
    }
  }
 
  //       
  public static void reflectPrivateField() {
    try {
      Class<?> classBook = Class.forName("com.android.peter.reflectdemo.Book");
      Object objectBook = classBook.newInstance();
      Field fieldTag = classBook.getDeclaredField("TAG");
      fieldTag.setAccessible(true);
      String tag = (String) fieldTag.get(objectBook);
      Log.d(TAG,"reflectPrivateField tag = " + tag);
    } catch (Exception ex) {
      ex.printStackTrace();
    }
  }
 
  //       
  public static void reflectPrivateMethod() {
    try {
      Class<?> classBook = Class.forName("com.android.peter.reflectdemo.Book");
      Method methodBook = classBook.getDeclaredMethod("declaredMethod",int.class);
      methodBook.setAccessible(true);
      Object objectBook = classBook.newInstance();
      String string = (String) methodBook.invoke(objectBook,0);
 
      Log.d(TAG,"reflectPrivateMethod string = " + string);
    } catch (Exception ex) {
      ex.printStackTrace();
    }
  }
 
  //     Zenmode 
  public static int getZenMode() {
    int zenMode = -1;
    try {
      Class<?> cServiceManager = Class.forName("android.os.ServiceManager");
      Method mGetService = cServiceManager.getMethod("getService", String.class);
      Object oNotificationManagerService = mGetService.invoke(null, Context.NOTIFICATION_SERVICE);
      Class<?> cINotificationManagerStub = Class.forName("android.app.INotificationManager$Stub");
      Method mAsInterface = cINotificationManagerStub.getMethod("asInterface",IBinder.class);
      Object oINotificationManager = mAsInterface.invoke(null,oNotificationManagerService);
      Method mGetZenMode = cINotificationManagerStub.getMethod("getZenMode");
      zenMode = (int) mGetZenMode.invoke(oINotificationManager);
    } catch (Exception ex) {
      ex.printStackTrace();
    }
 
    return zenMode;
  }
 
  //     
  public static void shutDown() {
    try {
      Class<?> cServiceManager = Class.forName("android.os.ServiceManager");
      Method mGetService = cServiceManager.getMethod("getService",String.class);
      Object oPowerManagerService = mGetService.invoke(null,Context.POWER_SERVICE);
      Class<?> cIPowerManagerStub = Class.forName("android.os.IPowerManager$Stub");
      Method mShutdown = cIPowerManagerStub.getMethod("shutdown",boolean.class,String.class,boolean.class);
      Method mAsInterface = cIPowerManagerStub.getMethod("asInterface",IBinder.class);
      Object oIPowerManager = mAsInterface.invoke(null,oPowerManagerService);
      mShutdown.invoke(oIPowerManager,true,null,true);
 
    } catch (Exception ex) {
      ex.printStackTrace();
    }
  }
 
  public static void shutdownOrReboot(final boolean shutdown, final boolean confirm) {
    try {
      Class<?> ServiceManager = Class.forName("android.os.ServiceManager");
      //   ServiceManager getService  
      Method getService = ServiceManager.getMethod("getService", java.lang.String.class);
      //   getService  RemoteService
      Object oRemoteService = getService.invoke(null, Context.POWER_SERVICE);
      //   IPowerManager.Stub 
      Class<?> cStub = Class.forName("android.os.IPowerManager$Stub");
      //   asInterface  
      Method asInterface = cStub.getMethod("asInterface", android.os.IBinder.class);
      //   asInterface    IPowerManager  
      Object oIPowerManager = asInterface.invoke(null, oRemoteService);
      if (shutdown) {
        //   shutdown()  
        Method shutdownMethod = oIPowerManager.getClass().getMethod(
            "shutdown", boolean.class, String.class, boolean.class);
        //   shutdown()  
        shutdownMethod.invoke(oIPowerManager, confirm, null, false);
      } else {
        //   reboot()  
        Method rebootMethod = oIPowerManager.getClass().getMethod("reboot",
            boolean.class, String.class, boolean.class);
        //   reboot()  
        rebootMethod.invoke(oIPowerManager, confirm, null, false);
      }
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}
상응하는 반사 논리 방법 을 호출 하 다

try {
      //     
      ReflectClass.reflectNewInstance();
 
      //          
      ReflectClass.reflectPrivateConstructor();
 
      //       
      ReflectClass.reflectPrivateField();
 
      //       
      ReflectClass.reflectPrivateMethod();
    } catch (Exception ex) {
      ex.printStackTrace();
    }
 
    Log.d(TAG," zenmode = " + ReflectClass.getZenMode());
 로그 출력 결 과 는 다음 과 같 습 니 다.
08-27 15:11:37.999 11987-11987/com.android.peter.reflectdemo D/peter.log.ReflectClass:reflectNewInstance book=Book{name='android 진급 의 빛',author='유 망 서'}
08-27 15:11:38.000 11987-11987/com.android.peter.reflectdemo D/peter.log.ReflectClass:reflectPrivateConstructor book=Book{name='Android 개발 예술 탐색',author='임 옥 강'}
08-27 15:11:38.000 11987-11987/com.android.peter.reflectdemo D/peter.log.ReflectClass: reflectPrivateField tag = BookTag
08-27 15:11:38.000 11987-11987/com.android.peter.reflectdemo D/peter.log.ReflectClass: reflectPrivateMethod string = I am declaredMethod 1 !
08-27 15:11:38.004 11987-11987/com.android.peter.reflectdemo D/peter.log.ReflectDemo:  zenmode = 0
이상 은 자바 의 고급 특성 반사 에 대한 상세 한 내용 입 니 다.자바 의 고급 특성 반사 에 관 한 자 료 는 저희 의 다른 관련 글 을 주목 하 시기 바 랍 니 다!

좋은 웹페이지 즐겨찾기