자바 반사 메커니즘 학습 1
다음은 자바 반사 의 간단 한 예 입 니 다.
import java.lang.reflect.Method;
public class MyObject {
String name;
String password;
public MyObject(String name, String password) {
super();
this.name = name;
this.password = password;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public static void main(String[] args) {
Method[] methods = MyObject.class.getMethods();
for(Method method : methods){
System.out.println("method = " + method.getName());
}
}
}
이 예 에서 MyObject 클래스 의 class 속성 을 호출 하여 대응 하 는 Class 클래스 의 대상 을 얻 고, 이 Class 클래스 의 대상 을 통 해 MyObject 클래스 의 방법 을 집합 합 니 다.이 방법의 집합 을 교체 하고 모든 방법의 이름 을 인쇄 합 니 다.출력 결과:
method = main
method = getName
method = setName
method = getPassword
method = setPassword
method = wait
method = wait
method = wait
method = equals
method = toString
method = hashCode
method = getClass
method = notify
method = notifyAll
자바 반사 체 제 를 사용 하면 운영 시기 에 자바 류 의 정 보 를 검사 할 수 있 습 니 다. 자바 류 의 정 보 를 검사 하 는 것 은 자바 반사 체 제 를 사용 할 때 하 는 첫 번 째 일 입 니 다. 이러한 정 보 를 얻 으 면 다음 과 같은 내용 을 얻 을 수 있 습 니 다.
Class
클래스 대상
클래스 의 정 보 를 검사 하기 전에 클래스 의 클래스 대상 을 가 져 와 야 합 니 다.자바 의 모든 유형 은 기본 유형 (int, long, float 등) 을 포함 하고 배열 도 이와 관련 된 Class 류 의 대상 이 있 습 니 다.컴 파일 기간 에 클래스 이름 을 알 고 있다 면 다음 과 같은 방식 으로 클래스 대상 을 가 져 올 수 있 습 니 다.
Class myObjectClass = MyObject.class;
컴 파일 기간 에 클래스 의 이름 을 모 르 지만 실행 기간 에 클래스 이름 의 문자열 을 얻 을 수 있다 면 클 라 스 대상 을 가 져 올 수 있 습 니 다.
String className = ... ;//
Class class = Class.forName(className);
Class. forName () 방법 을 사용 할 때 클래스 가 있 는 가방 의 이름 을 포함 하 는 클래스 의 전체 이름 을 제공 해 야 합 니 다.예 를 들 어 MyObject 류 는 com. jenkov. myapp 가방 에 있 는데 그의 전체 이름 은 com. jenkov. myapp. MyObject 이다.Class. forName () 방법 을 호출 할 때 컴 파일 경로 (classpath) 에서 해당 하 는 클래스 를 찾 지 못 하면 Class NotFoundException 을 던 집 니 다.
유명무실 하 다
클래스 대상 에서 두 버 전의 클래스 이름 을 가 져 올 수 있 습 니 다.getName () 방법 으로 클래스 의 모든 한정 클래스 이름 을 되 돌려 줍 니 다 (패키지 이름 포함):
Class aClass = ... // Class , Class
String className = aClass.getName();
클래스 이름 만 가 져 오 려 면 getSimple Name () 방법 을 사용 하 십시오.
Class aClass = ... // Class , Class
String simpleClassName = aClass.getSimpleName();
수식 부호
클래스 대상 을 통 해 public, private, static 등의 키 워드 를 방문 할 수 있 습 니 다. 다음 과 같은 방법 으로 클래스 의 수식 자 를 얻 을 수 있 습 니 다.
Class aClass = ... // Class , Class
int modifiers = aClass.getModifiers();
수정자 들 은 int 형식의 숫자 로 포장 되 어 있 습 니 다. 그러면 모든 수정자 들 은 하나의 비트 표지 (flag bit) 입 니 다. 이 표 지 는 수정자 의 유형 을 설정 하고 제거 할 수 있 습 니 다.자바. lang. reflect. Modifier 클래스 의 방법 으로 수정자 의 종 류 를 검사 할 수 있 습 니 다:
Modifier.isAbstract(int modifiers);
Modifier.isFinal(int modifiers);
Modifier.isInterface(int modifiers);
Modifier.isNative(int modifiers);
Modifier.isPrivate(int modifiers);
Modifier.isProtected(int modifiers);
Modifier.isPublic(int modifiers);
Modifier.isStatic(int modifiers);
Modifier.isStrict(int modifiers);
Modifier.isSynchronized(int modifiers);
Modifier.isTransient(int modifiers);
Modifier.isVolatile(int modifiers);
패키지 정보
Class 대상 을 사용 하여 다음 과 같은 방식 으로 가방 정 보 를 얻 을 수 있 습 니 다.
Class aClass = ... // Class , Class
Package package = aClass.getPackage();
패키지 대상 을 통 해 가방 에 대한 정 보 를 얻 을 수 있 습 니 다. 예 를 들 어 가방 이름, Manifest 파일 을 통 해 컴 파일 경로 에 있 는 jar 가방 의 지정 한 정 보 를 방문 할 수 있 습 니 다. 예 를 들 어 Manifest 파일 에서 가방 의 버 전 번 호 를 지정 할 수 있 습 니 다.
부계
Class 대상 을 통 해 클래스 의 부모 클래스 를 방문 할 수 있 습 니 다. 다음 과 같 습 니 다.
Class superclass = aClass.getSuperclass();
슈퍼 클 라 스 대상 은 사실 클 라 스 클래스 의 인 스 턴 스 이기 때문에 이 대상 에서 반사 작업 을 계속 할 수 있 습 니 다.실현 인터페이스
다음 과 같은 방식 으로 지정 한 클래스 가 실 현 된 인터페이스 집합 을 가 져 올 수 있 습 니 다.
Class aClass = ... // Class , Class
Class[] interfaces = aClass.getInterfaces();
하나의 클래스 가 여러 개의 인 터 페 이 스 를 실현 할 수 있 기 때문에 getInterfaces ();방법 은 클 라 스 배열 을 되 돌려 줍 니 다. 자바 인터페이스 에 도 해당 하 는 클 라 스 대상 이 있 습 니 다.메모: getInterfaces () 방법 은 현재 클래스 에서 실 현 된 인터페이스 만 되 돌려 줍 니 다.현재 클래스 의 부모 클래스 가 인 터 페 이 스 를 실현 하면 이 인 터 페 이 스 는 되 돌아 오 는 Class 집합 에 있 지 않 습 니 다. 비록 현재 클래스 는 부모 인터페이스 가 실현 되 었 지만.구조 기
당신 은 다음 과 같은 방식 으로 하나의 구조 방법 을 방문 할 수 있 습 니 다.
Constructor[] constructors = aClass.getConstructors();
Constructor 에 대한 더 많은 정 보 는 Constructors 를 방문 할 수 있 습 니 다.방법.
당신 은 다음 과 같은 방식 으로 하나의 종류의 모든 방법 을 방문 할 수 있 습 니 다.
Method[] method = aClass.getMethods();
변량
다음 과 같은 방식 으로 구성원 변 수 를 방문 할 수 있 습 니 다.
Field[] method = aClass.getFields();
주해
다음 과 같은 방식 으로 주 해 를 방문 할 수 있 습 니 다.
Annotation[] annotations = aClass.getAnnotations();
예시:
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class MyObject {
String name;
String password;
public MyObject(String name, String password) {
super();
this.name = name;
this.password = password;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public static void main(String[] args) {
Class myObject = MyObject.class;
Method[] methods = myObject.getMethods();
Field[] fields = myObject.getDeclaredFields();
Constructor[] constructors = myObject.getDeclaredConstructors();
System.out.println(myObject.getName());
System.out.println(myObject.getPackage());
System.out.println(myObject.getSuperclass());
System.out.println(myObject.getSimpleName());
System.out.println(myObject.getModifiers());
for(Method method : methods){
System.out.println("method = " + method.getName());
}
for(Field field : fields){
System.out.println("field = " + field.getName());
}
for(Constructor constructor : constructors){
System.out.println("constructor = " + constructor.getName());
}
}
}
출력 결과:
MyObject
null
class java.lang.Object
MyObject
1
method = main
method = getName
method = setName
method = getPassword
method = setPassword
method = wait
method = wait
method = wait
method = equals
method = toString
method = hashCode
method = getClass
method = notify
method = notifyAll
field = name
field = password
constructor = MyObject
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.