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): 우선 이 클래스의 클래스를 받습니다.Field field = ownerClass.getField(fieldName): 위와 같이 클래스를 통해 클래스 성명의 속성을 얻을 수 있습니다.
Object property = field.get(ownerClass): 여기는 위와 약간 다릅니다. 이 속성은 정적이기 때문에 클래스의 클래스에서 직접 가져옵니다.
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 method = ownerClass.getMethod(methodName,argsClass): methodName과 매개 변수의argsClass(방법의 매개 변수 형식 집합) 그룹을 통해 실행할 Method를 얻을 수 있습니다.
method.invoke(owner,args): 이 메서드를 실행합니다.invoke 방법의 매개 변수는 이 방법을 실행하는 대상 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);
}
여기서 말하는 방법은 매개 변수를 가진 구조 함수를 실행하여 새로운 실례를 만드는 방법이다.매개 변수가 필요하지 않으면 newone Class를 직접 사용할 수 있습니다.newInstance () 를 참조하십시오.Class newoneClass = Class.forName(className): 첫 번째 단계에서 구성할 실례적인 클래스를 얻습니다.
5~9행: 파라미터를 얻은 클래스 그룹.
Constructor cons = newoneClass.getConstructor(argsClass): 구조자를 얻습니다.
cons.newInstance(args): 새 인스턴스입니다.
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 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2)이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.