머리말:
최근 회사는 비즈니스 구성 요소화 프로세스를 진행하고 있으며 라우팅 구현은 Java의 반사 메커니즘을 사용합니다. 그것이 사용되기 때문에, 나는 그것을 공부하고 신중하게 요약하고 싶습니다. 실제로, 이전 EventBus 2.X 버전이든, 개조 또는 초기보기 주석 프레임 워크이든, Java의 반사 메커니즘을 크거나 그 이하로 사용합니다.
Java 반사 메커니즘은 무엇입니까?
Java 반사 메커니즘은 실행중인 상태에서 모든 클래스의 경우이 클래스의 모든 속성과 방법을 알 수 있다는 것입니다. 모든 객체의 경우 동적으로 획득하고 동적으로 호출하는 모든 메소드를 호출 할 수 있습니다.
반사 메커니즘은 어떤 기능을 제공합니까?
자바 반사 메커니즘 클래스 :
java.lang.class; // 클래스 java.lang.reflect.constructor; // 생성자 메소드 java.lang.reflect.field; // 클래스 멤버 변수 java.lang.reflect.method; // 클래스 메소드 java.lang.reflect.modifier; // 액세스 권한
Java 반사 메커니즘 구현 :
1.) 클래스 객체 얻기
// 첫 번째 방법은 개체를 사용하는 것입니다. getClass 메소드 person (); class <?> class1 = person.getClass (); // 두 번째 방법은 클래스 속성 class1 = person.class; try {// 세 번째 방법은 클래스 클래스의 정적 메소드를 사용하여 class1 = class.forname ( "com.reflcj.forname. (classNotFoundException e) {e.printstacktrace ();}2.) 클래스 객체의 요약 정보를 받으십시오
부울 isprimitive = class1.isprimitive (); // 기본 유형의 기본 유형인지 판단 부울 isarray = class1.isarray (); // 컬렉션 클래스 부울 isannotation = class1.isannotation () class1.isenum (); // enum class boolean isanonymousclass = class1.isanonymousclass (); // 익명의 내부 클래스 부울 isannotationPresent = class1.isannotationPresent (umprecated.class)인지 판단하는지 (// classname)에 의해 수정되었는지 (getname); 패키지 이름 경로 패키지 apackage = class1.getPackage (); // 클래스 패키지 정보 정보 string simplename = class1.getSimplename (); // 클래스 클래스 이름 int modifiers int modifiers = class1.getModifiers (); // class accistions class <?> class11.getleclaredclass (); // inner class1. class1.getDeclaringClass (); // 외부 클래스
3.) 클래스 객체의 속성, 메소드, 생성자 등을 가져옵니다.
필드 [] allfields = class1.getDeclaredFields (); // 클래스 객체 필드의 모든 속성을 가져옵니다. 클래스의 속성} catch (nosuchfieldexception e) {e.printstacktrace ();} method [] method [] method = class1.getDeclaredMethods (); // 클래스 객체 메소드의 모든 선언 메소드를 얻는다 [] AllMethods = class1.getmethods (); // classclass의 모든 메소드를 얻습니다. 학부모 클래스 객체 클래스 클래스 클래스 <?> [] interfaceclasses = class1.getInterfaces (); // 클래스 객체 생성자의 모든 인터페이스를 가져옵니다. {생성자 <?> constructor = class1.getDeclaredConstructor (new class [] {String.class}); // 지정된 선언 생성자 publicconstructor = class1.getConstructor (new class [] {}); // 지정된 선언 공공 구성 e) e) e) e.printstacktrace ();} 주석 [] 주석 [] 주석 = class1.getAnnotations (); // 클래스 객체의 모든 주석을 가져옵니다. class1.getGenericInterfaces (); // 클래스 객체의 모든 인터페이스의 유형 모음을 가져옵니다. 4.) 클래스 객체의 동적 생성
// 클래스 객체의 첫 번째 방법은 객체를 생성하기 위해 newInstance () 메소드를 호출합니다. obj = class1.newinstance (); // 객체의 두 번째 메소드는 해당 생성자 객체를 얻은 다음 생성자 <?> 생성자를 생성합니다. 생성자 = class1.getDeclaredConstructor (newlaredconstructor [] {string.class}); 생성자 .newinstance (new Object [] { "lcj"});5.) 동적으로 호출 함수
try {// 새 개체를 생성하십시오 : newInstance () 메소드 개체 obj = class1.newinstance ()를 사용하십시오. // 객체가 사람의 서브 클래스인지 판단합니다. 부울 isinstanceof = obj instance person; // 우선 메소드 메소드 메소드에 해당하는 메소드를 얻어야합니다. 메소드 메소드 = class1.getDeclaredMethod ( "setage", new Class [] {int.class}); // 지정된 함수를 호출하고 매개 변수 메소드를 전달합니다. invoke (obj, 28); method = class1.getDeclaredMethod ( "getage"); Object result = method.invoke (obj, new class [] {});} catch (InstantiationException e) {e.printstacktrace ();} catch (e.printstacktrace e) {e.printstacktrace ();} catch (nosuchmethodexception e) {e.printstacktrace ()} catch (intareTecection)} e.printstacktrace ();} 6.) 반사 메커니즘을 통해 일반적인 유형을 얻습니다
예를 들어, 다음 구조입니다
// People Class Public Class People People <t> {} // Person Class는 사람 클래스 공개 클래스 사람 <T> 연장 사람 <string> PersonIn일반적인 유형을 얻으십시오
person <string> person = new person <> (); // 첫 번째 방법은 객체 getClass 메소드 클래스 <?> class1 = person.getClass ()를 사용하는 것입니다. genericsuperclass = class1.getGenericSuperClass (); // typEtype [] interfacetypes = class1.getGenericInterfaces (); // 클래스 객체 getComponentType (genericsuperclass)의 모든 인터페이스를 가져옵니다. getComponentType (Interfacetypes [0]);
getComponentType 구현
private class <?> getComponentType (유형) {class <?> componentType = null; if (partionof parameterizedType) {// getActualTyPearguments ()이 유형의 실제 유형 매개 변수를 나타내는 유형의 배열을 반환합니다. 유형 [] realtyTyPearguments = ((ParameterizedType) type) .getActualTyPearGuments (); if (realtyTyPearguments! = null && realtyTyPearguments.length> 0) {componentType = (class <?>) 실제 동일 장치 [0]; }} else if (genericarraytype의 인스턴스 유형) {// 매개 변수 유형 또는 유형 변수 componentType = (class <?>) ((genericarraytype) 유형)을 나타내는 배열 유형. 6.) 반사 메커니즘을 통해 주석 정보를 얻습니다
여기서 우리는 메소드의 주석 정보를 예제로 얻는 데 중점을 둡니다.
{// 우선,이 메소드 메소드에 해당하는 메소드 객체를 얻어야합니다 메소드 메소드 = class1.getDeclaredMethod ( "jumptogoodsDetail", new Class [] {String.class, String.class}); 주석 [] annotations1 = method.getAntantations (); // 모든 메소드 주석 정보 주석 주석 주석 1 = method.getAntation (routeruri.class); // 지정된 주석 정보 typevariable [] typevariables1 = method.gettypeparameters (); 주석 [] [] parameterAnnotationsArray = method.getParameterAndotations (); // 모든 매개 변수 주석 정보 클래스 <?> [] parameterTypes = method.getParameterTypes (); // 모든 매개 변수 유형을 가져옵니다. method.getReturntype (); // 메소드의 리턴 유형 가져 오기 int modifiers = method.getModifiers (); // 메소드의 액세스 권한을 가져옵니다} catch (nosuchmethodexception e) {e.printstacktrace ();}반사 메커니즘의 응용 시나리오 :
반사 메커니즘의 장점과 단점 :
장점 : 런타임 유형의 판단, 동적 클래스 로딩 및 동적 프록시 사용 반사.
단점 : 성능은 문제입니다. 반사는 일련의 설명 작업과 동일합니다. JVM에게해야 할 일에 대해 알리는 성능은 직접 Java 코드보다 훨씬 느립니다.
요약 :
Java의 반사 메커니즘은 매일 사업 개발에 거의 사용되지 않지만 일부 기본 프레임 워크 구성에 널리 사용됩니다. 오늘 나는 간단히 요약하고 배웠으며, 나중에 그것을 보충하기 위해 나중에 사용될 알 수없는 지식이 여전히 많이 있습니다.
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.