java 반사 메커니즘의 진일보한 이해
5588 단어 java 반사 메커니즘
JAVA 반사 메커니즘은 운행 상태에서 임의의 클래스에 대해 이 클래스의 모든 속성과 방법을 알 수 있다.임의의 대상에 대해 임의의 방법을 사용할 수 있다.이런 동적으로 얻은 정보와 동적 호출 대상의 방법의 기능을 자바 언어의 반사 메커니즘이라고 한다.자바 반사 메커니즘은 주로 다음과 같은 기능을 제공한다. 실행할 때 임의의 대상이 속한 클래스를 판단한다.운행할 때 임의의 종류의 대상을 구성한다.운행 시 임의의 클래스가 가지고 있는 구성원 변수와 방법을 판단한다.실행할 때 임의의 대상을 호출하는 방법;동적 프록시를 생성합니다.
java 반사 메커니즘의 존재는 클래스 이름만 알면 이 클래스의 실례를 생성할 수 있게 한다.만약 이렇게 말한다면 자바가 대상 언어로서의 봉인성을 위반한 것이 아니라, 더욱 무서운 것은 네가 이런 종류의 속성 (public) 을 얻을 수 있다는 것이다.그러나 사실 반사 메커니즘의 존재는 봉인을 파괴하지 않는다. 봉인은 어떤 종류의 실례를 생성할 수 있지만 현재 당신이 있는 클래스에서 특정한 클래스를 생성하려면 이 클래스는 현재 클래스에서 볼 수 있어야 한다. 그러면 이 클래스는 현재 클래스의 구성원 중 하나여야 한다.그것은 비록 속성의 값을 얻을 수 있지만 얻은 속성 값 자체가public이기 때문에 봉인성을 파괴했다고 할 수 없다.
예:
public class WTAimObject {
public String name = "Jobs";
public String getName(){
return name;
}
}
1 public class WTGetField { 2
3 public static Object getProperty(Object owner, String fieldName) throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException{ 4 Class ownerClass = owner.getClass(); 5
6 Field field = ownerClass.getField(fieldName); 7
8 System.out.println(field.toString()); 9
10 System.out.println(field.getName()); 11
12 Object property = field.get(owner); 13 return property; 14 } 15
16 public static void main(String args[]) throws SecurityException, IllegalArgumentException, NoSuchFieldException, IllegalAccessException{ 17 WTAimObject aimObject = new WTAimObject(); 18
19 System.out.println(WTGetField.getProperty(aimObject, "name").toString()); 20 } 21 }
이 출력 결과는요.
public java.lang.String WTAimObject.namenameJobs
그래서 과제 필드의 뜻은 속성 이름, 속성 소속 클래스, 속성의public,private 등을 포함한다.이 속성이field에 있다면private입니다.get(owner) 시 오류가 발생하지만field.name ()은 사용할 수 없습니다.필드를 통과할 수 없습니다.get(owner);인스턴스를 생성하고 값을 가져옵니다.
또 하나 주의해야 할 것은 어떤 대상을 집행하는 방법인데 이것도 동적 에이전트가 실현할 수 있는 기초이다!
아주 좋은 예가 하나 있는데 바로 이사 왔어요.
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이며 메서드의 반환 값이기도 합니다.
이 중에서 우리는 우리가 하나의 클래스의 정의를 처리할 때 모든 조작은 이 클래스의class에 대한 조작이라는 것을 알 수 있다. 이class 대상은 JVM이 실행할 때 만들어진 것으로 현실과 구조가 지원되지 않으며 가상 기기는 모든 유형에 하나뿐인 Class를 만든다.일반 JVM에서 새 클래스를 표시하는 대상을 만나면 JVM은 일반적으로 이 클래스의 클래스를 불러왔는지 확인합니다. 불러왔으면 이 클래스를 사용하여 클래스의 모든 대상을 생성합니다.
Class류의 해석을 참고하십시오: http://lavasoft.blog.51cto.com/62575/15433/ 이것은 매우 상세합니다.
반사 메커니즘 참조: http://azrael6619.iteye.com/blog/429797