현장 클래스
필드 클래스는 필드 유형을 쿼리하고 필드 값을 설정하거나 읽는 데 사용할 수있는 일부 방법을 정의합니다. 이러한 방법을 상속 회원 방법과 결합하면 필드 선언에 대한 모든 정보를 찾아 특정 객체 또는 클래스의 필드를 조작 할 수 있습니다.
GetGenericType 메소드는 필드의 선언 유형을 나타내는 유형 인스턴스를 반환합니다. String 또는 int와 같은 사소한 유형의 경우,이 메소드는 list <stri ng>와 같은 매개 변수화 된 유형의 경우 string.class 및 int.classo와 같은 클래스 객체를 리턴트합니다. 예를 들어 T와 같은 유형의 경우 매개 변수 인스턴스의 인스턴스를 리턴트합니다. 메소드는 typevariable 인스턴스를 반환합니다.
레거시 GetType 메소드는 필드 유형의 클래스 객체를 반환합니다. 사소한 유형의 경우,이 방법은 getGenericType 메소드와 동일하게 작동합니다. 선언 된 필드 유형이 매개 변수화 된 유형 인 경우, getType 메소드는 매개 변수화 된 유형, 즉 원래 유형의 클래스 객체를 지우기 위해 해당 클래스 객체를 반환합니다. 예를 들어, 목록 <stri ng>로 선언 된 객체의 경우 gettype는 Li St. 클래스를 반환합니다. 필드의 선언 된 유형이 유형 변수 인 경우 getType 메소드는 유형 변수를 지우기 위해 해당 클래스 객체를 반환합니다. 예를 들어, 클래스 foo <ding>가 있다고 가정하고 t 유형으로 선언 된 필드의 경우 getding ype가 객체를 반환합니다.
클래스 객체. foo가 foo <extends number>로 선언되면 get 아래의 ype는 숫자를 반환합니다.
isenumconstant 메소드를 사용하여 필드가 열 상수인지 여부를 쿼리 할 수 있습니까? 객체 인용을 받아들이고 개체 ect 값을 반환하는 이러한 방법은 공통 형식뿐만 아니라 기본 유형을 직접 처리 할 수있는보다 전문화 된 형태를 가지고 있습니다. 이 모든 방법은 작동 할 객체를 지정하는 인용문을 수락합니다. 정적 필드의 경우이 개체 인용문이 무시되므로 설정할 수도 있습니다.
NULL로 설정하십시오. 다음 방법은 객체의 짧은 필드의 값을 인쇄합니다.
public static void printshortfield (Object O, String Name)는 nosuchfieldexception, 불법 행위 {field 필드 = O.getClass (). getfield (name); 짧은 값 = (짧은) field.get (o); System.out.println (값);get 메소드의 반환 값은이 필드에서 참조하는 객체 일 수 있습니다. 필드가 원시 유형 인 경우 방법은 적절한 유형의 래퍼 클래스 객체를 반환합니다. "Hort-Type 필드의 경우 Get 메소드는 필드 값을 포함하는 유형의 단락 객체를 반환하고 로컬 변수 값에 할당되면 객체 값이 자동으로 Unboxed됩니다.
세트 방법의 사용은 유사합니다. 단기 필드를 제공된 값으로 설정하는 방법은 다음과 같습니다.
public static voi setshortfield (Object O, String Name, Short NV) NosuchfieldException, 불법 행위 예고 필드 필드 = 0.getClass (). getfield (이름); 필드 .SET (o .nv);
SET은 객체 유형의 매개 변수를 허용하지만 짧은 값을 직접 전달하여 랩핑 변환으로 짧은 객체로 랩핑 할 수 있습니다.
위의 방법에서, 지정된 객체의 도메인이 접근 할 수 없고이 액세스 제어가 시행되면, 불법 행위 예외 예외가 발생됩니다. 통과 된 객체가 도메인의 유형과 다르면 불법적 인 예외 예외가 발생합니다. 도메인이 정적이 아닌 상태이고 통과 된 객체 참조가 NULL 인 경우 NULLPOINterException 예외가 발생합니다. 정적 도메인에 액세스하려면 클래스가 초기화되어야 할 수 있으므로 메소드는 예외 예외 예외를 던집니다.
필드 클래스에는 기본 유형을 얻고 설정하는 특정 방법도 있습니다. 예를 들어, getPrimitive7ype를 호출하고 필드 객체에서 Primitive7ype를 설정할 수 있습니다. GET 메소드는 다음 진술에서 사용할 수 있습니다.
짧은 값 = field.getShhort (o);
설정 방법은 다음 문서에서 사용할 수 있습니다.
Field.SetShort (O, NV);
래퍼 형 객체의 사용은 위의 두 가지 방법으로 선언 된 진술에서 피할 수 있습니다.
필드 클래스는 AnnotatedElement 인터페이스를 구현하므로 섹션 16.2와 같은 도메인에 쿼리하고 적용 할 수도 있습니다.
메모.
위에서 설명한 방법을 사용하면 필드 객체를 값을 조작하는 방법으로 사용할 수 있지만 피해야합니다. Java Language는 프로그램의 편집 기간 동안 가능한 한 많은 프로그래밍 오류를 포착하기 때문에 코드를 작성할 때 "IELD 객체"와 같은 간접적 인 방법이 더 많이 사용되므로 코드로 컴파일하기 전에 더 많은 오류를 방지 할 수 있습니다. 또한 이전 코드에서 정확히 어떤 일이 일어날 지 알기 위해 일반 구문에서 도메인 이름을 직접 사용할 때보 다 코드를 읽는 데 더 많은 에너지를 소비했음을 알 수 있습니다.
최종 필드
일반적으로 필드 선언 결승전을 설정하면 불법 행위 지출이 발생합니다.
예외, 이것은 최종 필드의 가치가 결코 변하지 않기 때문에 우리가 기대할 수있는 것입니다. 그러나 몇 가지 특별한 사례가 있습니다. 예를 들어, 맞춤형 사막화 (섹션 20.8.4 참조)에서는 인스턴스 필드의 반사를 통해서만 달성 할 수있는 최종 필드의 값을 변경하는 것이 합리적이며, SetAccessible (true)이 필드 객체에서 호출 된 경우에만 적합합니다. setAccessible (true)을 성공적으로 호출하는 것만으로는 충분하지 않으며 실제로 호출되어야합니다.
이 기능은 고도로 전문화 된 맥락을 위해 제공되며 일반적인 목적이 아니며 컨텐츠의 무결성 만 유지하기 위해 소개합니다. 사용자 정의 된 사막화와 같은 특정 맥락을 벗어난 경우 최종 필드의 가치를 변경하면 예상치 못한 또는 심지어 치명적인 결과가 발생할 수 있습니다. 이러한 맥락 밖에서, 최종 필드에 대한 변경이 보인다는 보장은 없습니다. 그러한 맥락에서도 보안 메커니즘 이이 기술을 사용하여 인코딩 할 때 코드의 실행을 방해하지 않도록해야합니다. 상수 변수의 값으로 최종 필드를 변경하면 (섹션 2.2.3 참조) 반사를 사용하여 그러한 수정을 달성하지 않는 한이 변경 사항이 보이지 않습니다.
방법 클래스
회원 클래스의 메소드 클래스 및 상속 된 메소드를 사용하면 메소드 선언에 대한 전체 정보를 얻을 수 있습니다.
"공개 유형 getGenericreTurnTypeo :이 메소드는 대상 메소드의 반환 유형의 유형 객체를 반환합니다. 대상 메소드가 void를 반환하도록 선언하면 메소드가 void.classo를 반환합니다.
"public type [] getGenericparameterTypes () :이 메소드는 모든 매개 변수 유형의 대상 메소드 유형의 객체 배열을 반환합니다.이 방법은 매개 변수의 선언 순서대로 배열에 저장 될 대상 메소드 유형의 유형 객체를 반환합니다. 대상 방법에 매개 변수가 없으면 메소드는 빈 배열을 반환합니다.
.public 유형 [] GetGeneri Cacheti OnTypes Q :이 메소드는 Throws 절에 나열된 모든 예외 유형의 유형 배열을 반환하며, 이는 예외 선언 순서대로 배열에 저장됩니다.
대상 메소드가 예외를 선언하지 않으면 메소드는 빈 배열을 반환합니다.
Java는 또한 getReturnType, getParameterTypes 및 getExceptionTypes 메소드를 유형 대상 대신 객체로 반환하는 메소드를 제공합니다. field.getType, 매개 변수화 유형 및 유형 변수를 사용하는 것과 마찬가지로 소거에 해당하는 클래스 객체로 표시됩니다.
이 메소드 클래스는 AnnotatedElement를 구현하고 섹션 16.2에서 논의 된대로 메소드에 적용되는 주석을 쿼리 할 수 있습니다. 또한, 메소드 클래스는 GetParameterAntations를 제공하여 메소드 매개 변수에 적용되는 주석에 대한 액세스를 제공합니다. getParameterAnnotations 방법은 주석 어레이를 반환 할 수 있으며, 여기서 가장 바깥 쪽 배열의 각 요소는 메소드의 매개 변수에 해당합니다. 매개 변수에 주석이 없으면 메소드는이 매개 변수에 대해 길이 0의 주석 배열을 반환합니다. 메소드 객체로 표시되는 메소드가 자체가 주석 요소 인 경우 getDefaultValue 메소드는 요소의 기본값을 나타내는 개체 객체를 반환합니다. 메소드 객체 자체가 주석 요소가 아니거나 기본값이없는 경우 메소드는 NULL을 반환합니다. 메드 클래스도 일반 명확성을 구현하므로 GetTyPeparameters 메소드가 정의되어있어 유형의 대상 객체 배열이 반환됩니다. 주어진 메소드 객체가 일반적인 메소드가 아닌 경우 메소드는 빈 배열을 반환합니다.
ISVARARGS 메소드를 사용하여 메소드 객체가 변수 인덱스 메소드인지 확인하고 I SBRIDGE 메소드를 사용하여 브리지 방법인지 확인할 수 있습니다.
메소드 개체를 사용하는 가장 흥미로운 방법은 반사적으로 자체를 호출하는 것입니다.
.Public Object Invoke (Object onthis, Object… Args)는 NVocation에서 불법 행위 지출, 불법 행위 지출, Argetexception을 던지는 경우 :이 메소드는이 객체에서 메소드 객체에 의해 정의 된 메소드를 호출하고 Args의 값을 사용하여 호출 된 메소드의 매개 변수를 설정합니다. 비 정적 메소드의 경우 실제 유형의 유형은 호출 할 방법의 구현을 결정하는 반면 정적 방법의 경우 무시되고 일반적으로 null로 설정됩니다. ARG의 값 수는 호출 된 메소드의 실제 매개 변수 수와 동일해야하며, 이러한 값의 유형은 모두 호출 된 메소드의 매개 변수에 할당되어야합니다. 그렇지 않으면 llegalargumentexception 예외를 얻을 수 있습니다. 가변 인용 메소드의 마지막 매개 변수는 배열이므로 배열을 실제로 전달하려는 "Mutable"인용으로 채워야합니다. 액세스 할 수없는 메소드를 호출하려면이 방법에 불법 행위 예외가 발생합니다. 호출 된 메소드가 ON Object의 메소드가 아닌 경우,이 메소드는 예외에 llegalargumentexcepti를 던집니다. on this가 null이고 비 정적 인 경우,이 메소드는 1pointerexception 예외를 던집니다. 이 메소드 객체가 정적 메소드를 나타내고 정적 메소드가 여전히 초기 상태에 있다고 선언하는 클래스가 초기화 될 경우, 메소드는 예외에 대한 예외를 제외합니다. 호출 된 방법에 외계인의 힘이 있으면 invocationTargeteXception 예외가 발생합니다.
Invoke 메소드를 사용하면 기본 유형을 직접 전달하거나 적절한 래퍼 클래스를 사용할 수 있습니다. 래퍼 클래스로 표시된 유형은 메소드에 의해 선언 된 매개 변수 유형에 할당되어야합니다. 이중 유형 인용을 감싸기 위해 길고 플로트 또는 이중을 사용할 수 있지만, 이중 또는 플로트 유형 인용을 랩핑하기 위해 더블을 사용할 수는 없습니다. 이중은 Long 또는 Oat에 할당 할 수 없기 때문입니다. Invoke 메소드에 의해 반환 된 객체의 처리 방법은 Field.get과 동일하며, 이는 해당 래퍼 클래스의 기본 유형을 반환합니다. 메소드가 무효로 선언되면 호출 메소드는 NULL을 반환합니다.
간단히 말해서 호출 방법을 사용하면 Java 언어로 법적 매개 변수 만 사용할 수 있습니다.
동일한 유형과 값을 가진 우선 순위. 예를 들어, 다음 호출
return str.indexof ( ".", 8);
반사를 사용하여 다음 형식으로 작성할 수 있습니다.
던질 수있는 fas; {method Indexm = string.class를 시도하십시오. getMethod ( "index0f", String.class, int.class); return (Integer) indexm.invoke (str, ",", 8); } catch (nosuchmethodexception e) {실패 = e; } catch (invocationTargeteXception e) {fas = e .getCause (); } catch (delegalaccessexception e) {실패 = e; } FAS 던지기;반사를 사용할 때 런타임에서 호출을 사용할 때만 컴파일러의 직접 통화 보안 검사를 수행 할 수 있지만 반사 기반 코드는 직접 통신 코드와 의미 적으로 동등한 보안 검사를받습니다. 액세스 점검은 약간 다른 방식으로 수행 될 수 있습니다. 보안 관리자는 직접 호출 할 수 있어도 패키지의 메소드 액세스를 거부 할 수 있습니다.
우리 가이 형태의 전화를 사용할 수있을 때, 우리는 그것을 피할 충분한 이유가 있습니다. 그러나 디버거 또는 사용자 입력을 객체에서의 작업으로 해석 해야하는 기타 일반 응용 프로그램을 작성할 때 호출 또는 GET/SET 메소드를 사용하는 경우에 합리적입니다. 이 메소드 객체는 다른 언어와 유사한 메소드 포인터로 어느 정도 사용될 수 있지만, 더 나은 도구, 특히 인터페이스, 추상 클래스 및 중첩 클래스가 있습니다.이 클래스는 일반적으로 다른 언어로 된 메소드 포인터로 해결되는 문제를 처리하는 데 사용할 수 있습니다.