최근에 내 작업에서 이와 같은 문제가 발생했습니다.
특정 프로젝트의 모든 인터페이스에 대한 테스트 도구를 만들었습니다. Java Swing 기술을 사용 하여이 프로젝트에는 다양한 버전이 있습니다. 버전의 모든 인터페이스가 동일하지는 않으며, 내가 만든 도구는 모든 버전과 호환되어야합니다.
그래서이 문제가 소개되었습니다.
일부 버전에는 일부 인터페이스가 존재하지 않으면 인터페이스를 통해이 작업을 수행 할 때 오류 가보고됩니다. 따라서 모든 버전과 호환 되려면 메소드를 호출하기 전에 메소드가 존재하는지 여부를 고려해야합니다. 동시에, 컴파일 중에 예외를 제외하지 않기 위해, 메소드를 호출 할 때
또한 반사를 통해 호출해야하며 특정 구현은 다음과 같습니다.
1. 반사를 사용하여 방법이 존재하는지 여부를 결정하십시오
/ *** 메소드가 존재하는지 여부를 결정* @param obj jobjepservice instance* @param methodname 메소드 이름* @param paratypes 메소드 형식 매개 변수 유형 배열* @return*/ public static boolean judgemethodisexist (Object obj, String MethodName, class [] paratypes) {boolean result = true; {if (null! = obj) {method method = obj.getClass (). getMethod (MethodName, Paratypes); }} catch (nosuchmethodexception ex) {showwarninfo (ex.toString ()); log.error ( "예외 :" + mainjframe.hostname + "; 세부 사항은 다음과 같습니다." + ex.getMessage ()); 결과 = 거짓; } 반환 결과; }매개 변수 설명 :
(1) OBJ : 메소드를 부르는 객체
(2) MethodName : 호출되는 메소드의 이름
(3) 파라 타입 : 메소드에 필요한 매개 변수 유형 (다중 배열)
이 메소드를 통해 OBJ 객체를 통해 호출하는 메소드 이름 (매개 변수 유형) 메소드가 존재하는지 확인할 수 있습니다. 존재하지 않으면 nosuchmethodexception 예외가 실행됩니다.
2. 컴파일 시간 예외를 피하려면 반사를 통해 메소드를 호출하십시오.
sysuser = mainjframe.getsysuser (); class [] paramobj = {string.class, long.class, string.class, String.class, int.class}; //이 방법이 존재하는지 여부를 판단합니다. 부울 isexist = commonutil.judgemethodisexist (sysuser, "createbucket", paramobj); if (isexist) {try {// method class clazz = sysuser.getClass (); // 메소드 이름-메소드의 매개 변수 유형 (매개 변수 순서) 메소드 작성 버킷 = clazz.getDeclaredMethod ( "CreateBucket", String.class, long.class.class.class.class, int.class); int create = (int) createbucket.invoke (sysuser, bucetName, long.parselong (bucetSize), BucketLoc, BucketAcl, integer.parseint (stringUtil.emptytozero (BucketCycle))); if (create == 1) {commonutil.showinfo ( "성공적으로 만들어진 버킷"); log.info ( "성공적으로 생성 된 버킷"); } else {commonutil.showwarninfo ( "버킷 생성 실패, 서버 내부 오류!"); log.info ( "버킷 생성 실패, 서버 내부 오류"); }} catch (예외 예) {commonutil.showwarninfo (ex.getMessage ()); log.error ( "예외 :" + mainjframe.hostname + "; 세부 사항은 다음과 같습니다." + ex.getMessage ()); }}위 코드에서 :
1 행 : Method CreateBucket 메소드를 호출하는 객체 sysuser
2 행 : 메소드가 존재하는지 여부를 결정할 때 사용되는 방법의 매개 변수 유형 배열
3 행 : 메소드 배열, 메소드 이름 및 매개 변수 유형에 따라 메소드가 존재하는지 확인
위의 세 줄을 통해 메소드가 존재하면 다음 작업이 실행됩니다. 존재하지 않으면 예외 정보가 프롬프트됩니다.
6 행 : 객체의 클래스를 얻습니다
7 행 : 메소드 메소드 개체 가져 오기, 매개 변수는 메소드 이름 및 매개 변수에 해당하는 유형입니다.
8 행 : 메소드 개체 반사를 통해 CreateBucket 메소드를 호출하십시오. 매개 변수는 각각 Sysuser 객체와 필요한 매개 변수 (값)입니다.
위의 방법을 통해 객체의 인터페이스가 존재하지 않더라도 컴파일 타임 예외는 발생하지 않습니다.
솔직히 말해서, 이것은 제가 프로젝트에서 Java Reflection과 관련된 문제를 처음 처음이므로 기록해야합니다!
요약
위는 실제 작업에서 Java 반사에 대한이 기사의 응용 프로그램 노트의 전체 내용입니다. 모든 사람에게 도움이되기를 바랍니다. 관심있는 친구들은이 사이트를 계속 참조 할 수 있습니다.
Java Reflection Tutorial
Java 반사 메커니즘에 대해 알아야 할 사항
단점이 있으면 메시지를 남겨 두십시오. 이 사이트를 지원해 주신 친구들에게 감사드립니다!