자바 고급 특성의 반사
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
이상 은 자바 의 고급 특성 반사 에 대한 상세 한 내용 입 니 다.자바 의 고급 특성 반사 에 관 한 자 료 는 저희 의 다른 관련 글 을 주목 하 시기 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JAVA 객체 작성 및 제거 방법정적 공장 방법 정적 공장 방법의 장점 를 반환할 수 있습니다. 정적 공장 방법의 단점 류 공유되거나 보호된 구조기를 포함하지 않으면 이불류화할 수 없음 여러 개의 구조기 파라미터를 만났을 때 구축기를 고려해야 한다...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.