Java 반사 메커니즘 및 Method.invoke 상해
JAVA 반사 메커니즘은 운행 상태에서 임의의 클래스에 대해 이 클래스의 모든 속성과 방법을 알 수 있다.임의의 대상에 대해 임의의 방법을 사용할 수 있다.이런 동적으로 얻은 정보와 동적 호출 대상의 방법의 기능을 자바 언어의 반사 메커니즘이라고 한다.
자바 반사 메커니즘은 주로 다음과 같은 기능을 제공한다. 실행할 때 임의의 대상이 속한 클래스를 판단한다.운행할 때 임의의 종류의 대상을 구성한다.운행 시 임의의 클래스가 가지고 있는 구성원 변수와 방법을 판단한다.실행할 때 임의의 대상을 호출하는 방법;동적 프록시를 생성합니다.
1. 어떤 대상의 속성을 얻는다
public Object getProperty(Object owner, String fieldName) throws Exception {
Class ownerClass = owner.getClass();
Field field = ownerClass.getField(fieldName);
Object property = field.get(owner);
return property;
}
Class ownerClass = owner.getClass(): 객체의 Class를 받습니다.
Field field = ownerClass.getField(fieldName): 클래스 선언의 속성을 클래스에서 가져옵니다.
Object property = field.get(owner): 대상을 통해 이 속성의 실례를 얻을 수 있습니다. 만약 이 속성이 비공유적이라면 IllegalAccessException에 보고합니다.
2. 어떤 종류의 정적 속성을 얻는다
public Object getStaticProperty(String className, String fieldName)
throws Exception {
Class ownerClass = Class.forName(className);
Field field = ownerClass.getField(fieldName);
Object property = field.get(ownerClass);
return property;
}
Class ownerClass = Class.forName (className): 이 클래스의 Class를 먼저 가져옵니다.
Field field = ownerClass.getField (fieldName): 클래스 성명의 속성을 위에서 설명한 것과 같습니다.
Object property = field.get(ownerClass): 여기는 위와 약간 다르다. 이 속성은 정적이기 때문에 클래스의Class에서 직접 가져온다.
3. 어떤 대상을 집행하는 방법
public Object invokeMethod(Object owner, String methodName, Object[] args) throws Exception {
Class ownerClass = owner.getClass();
Class[] argsClass = new Class[args.length];
for (int i = 0, j = args.length; i < j; i++) {
argsClass[i] = args[i].getClass();
}
Method method = ownerClass.getMethod(methodName,argsClass);
return method.invoke(owner, args);
}
Class owner_class = owner.getClass (): 우선 이 대상의 Class를 받아야 합니다.
5~9줄: Method를 찾는 조건으로 매개 변수의 Class 그룹을 설정합니다.
Method method = ownerClass.getMethod (methodName,argsClass):methodName과 매개 변수의argsClass (방법의 매개 변수 형식 집합) 그룹을 통해 실행할 Method를 얻습니다.
method.invoke(owner,args): 이 Method를 실행합니다.voke 방법의 매개 변수는 이 방법을 실행하는 대상 owner와 매개 변수 그룹args입니다. 이렇게 이해할 수 있습니다. owner 대상에 매개 변수args가 있는method 방법입니다.반환 값은 Object이며 메서드의 반환 값이기도 합니다.
4. 어떤 종류의 정적 방법을 실행한다
public Object invokeStaticMethod(String className, String methodName,
Object[] args) throws Exception {
Class ownerClass = Class.forName(className);
Class[] argsClass = new Class[args.length];
for (int i = 0, j = args.length; i < j; i++) {
argsClass[i] = args[i].getClass();
}
Method method = ownerClass.getMethod(methodName,argsClass);
return method.invoke(null, args);
}
기본적인 원리는 실례 3과 같고 차이점은 마지막 줄이며 invoke의 매개 변수는null이다. 이것은 정적 방법이기 때문에 실례를 빌려 운행할 필요가 없다.
5. 새 인스턴스
public Object newInstance(String className, Object[] args) throws Exception {
Class newoneClass = Class.forName(className);
Class[] argsClass = new Class[args.length];
for (int i = 0, j = args.length; i < j; i++) {
argsClass[i] = args[i].getClass();
}
Constructor cons = newoneClass.getConstructor(argsClass);
return cons.newInstance(args);
}
여기서 말하는 방법은 매개 변수를 가진 구조 함수를 실행하여 새로운 실례를 만드는 방법이다.매개 변수가 필요하지 않으면 newoneClass를 직접 사용할 수 있습니다.newInstance()를 사용하여 수행할 수 있습니다.
Class newoneClass = Class.forName (className): 첫 번째 단계는 구성할 실례를 얻는 Class입니다.
5~9행: 매개 변수를 얻은Class 그룹.
Constructor cons = newoneClass.getConstructor(argsClass): 구조자를 얻습니다.
cons.새 인스턴스
6. 어떤 종류의 실례인지 판단
public boolean isInstance(Object obj, Class cls) {
return cls.isInstance(obj);
}
7. 수조 중의 어떤 원소를 얻는다
public Object getByArray(Object array, int index) {
return Array.get(array,index);
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.