간단한 설명
나는 항상 Java의 기성품 대표단의 부족에 대해 걱정하고 있습니다. 다행히도 최근에 시간이 있고 참조를 위해 반사 된 간단한 대표단 모듈을 썼습니다.
모듈 API
Public Class Delegater () // 빈 매개 변수 구성,이 클래스는 대의원 인스턴스를 관리하고 대의원 메소드를 구현하고 정적 메소드 대의원을 추가하고 정수 값 ID를 반환하여 메소드 및 매개 변수로 구성된 인스턴스를 나타냅니다. 실패하면 -1을 반환하십시오. public synchronized int addfunctiondelegate (class <?> srcclass, string methodname, object ... 객체 ... params); // 인스턴스 메소드를 추가하고, 정수 값 ID를 반환하여 메소드 및 매개 변수로 구성된 인스턴스를 나타냅니다. 실패하면 -1을 반환하십시오. public synchronized int addfunctiondelegate (객체 srcobj, string methodname, object ... params); // 정수 ID를 기반으로 대의원 인스턴스에서 메소드 위임장을 삭제하고 성공적인 공개 동기화 된 부울 removeMethod (intergidated)에서 모든 방법을 실행하는지 (void)에서 모든 방법을 실행하는지 여부를 반환합니다. invokeallmethod (); // 매개 변수 테이블을 매개 변수 유형 테이블 개인 클래스 <?> [] getParamTypes (Object [] params)로 변환합니다. // 지정된 클래스, 메소드 이름 및 매개 변수 유형 테이블 개인 메소드에서 메소드 인스턴스 개인 메소드를 얻습니다. params) // delegatenode 클래스는 메소드 인스턴스 및 매개 변수 테이블을 포함하여 객체 구성을 사용하지 않을 때 정적 메소드 위임을 설명합니다. 클래스 delegatenode (Object Srcobj, method refmethod, object [] params) // delegatenode class 클래스 인스턴스, 메소드 인스턴스 및 매개 변수 테이블을 포함하여 객체 구성을 사용할 때 인스턴스 메소드 위임을 설명합니다.
소스 코드
import java.lang.reflect.invocationTargetexception; import java.lang.reflect.method; import java.util.hashtable.hashtable;/** Delegater 클래스를 사용하여 rtti와 반사를 사용하여 java*@author 3- 웨이 브릭**/public classe delegater {intger. 할당 변수 hashtable <integer, delegatenode> nodetable; // 해당 대리인 공개 대표자 () {nodetable = new Hashtable <integer, delegatenode> ();} // int addfunctiondelegate (class <?> srcclass, string methodsame, string methodsame, stritname) {class <?> [] paramtypes = getParamTypes (params); 메소드 refmethod; if ((refMethod = getDStMethod (srcClass, methodname, paramtypes))! = null) {register ++; nodetable.put (register, new delegatenode (reftmethod, params)); elour}}} 메소드는 대중 동기화 된 int addfunctionDelegate (Object SrcOBJ, String MethodName, Object ... 객체 ... params) {class <?> [] paramtypes = getParamTypes (params); method refMethod; if (refMethod = getDstMethod (srcobj.getmas, methodname, methodname, paramtypes))) {register ++; nodetable.put (register, new delegatenode (srcobj, refmethod, params)); return register;} else {return -1;}} // 메소드를 삭제합니다. 공개 동기화 된 부울 removeMethod (int registerid) {if (nodetable.containskey (repistorid)); false;} // 대의원 메소드를 실행하지 않으면 공개적으로 공개적으로 동기화 된 void void invokeallmethod () {for (delegatenode node : nodetable.values ()) {node.invokemethod ();}} // 매개 변수 유형 테이블 <? 새 클래스 <?> [params.length]; for (int i = 0; i <params.length; i ++) {paramtypes [i] = params [i] .getclass ();} return paramtypes;} // 클래스 클래스 인스턴스, 메소드 이름 및 매개 변수 유형 테이블 개인 메소드 GetDStMethod, strcclass, string methodname <? {method result = null; try {result = srcclass.getMethod (methodName, paramtypes); if (result.getReturnType ()! = void.class) {system.out.println ( "경고, 메소드 :"+MethodName+"}} catch (noSuchmethodex e)}}. {System.out.println ( "찾을 수 없음 :"+methodName+", 그것이 존재하고 가시적인지 확인하십시오! this.params = params;} public delegatenode (object srcobj, method refmethod, object [] params) {this.srcobj = srcobj; this.refMethod = refMethod; 이. 실패하다!");}}}모듈 테스트
Public Class DelegaterTest {public void showinfo () {System.out.println ( "hello delegate!");} public void showcustomInfo (String info) {system.out.println (info);} public static void showstaticInfo () {System.out.println ( "STATIC DELEGATE!"); showCustomStaticInfo (문자열 정보) {system.out.println (info);} public static void main (string [] args) {Delegater dele = new delegater (); delegatertest tester = new DelegaterTest (); int id = dele.addfunctionDelegate (테스터, "showinfo"); dele.addfunctionDelegate (테스터, "showcustominfo", "custom!"); dele.addfunctionDelegate (delegatertest.class, "showstaticInfo"); dele.addfuncti onDelegate(DelegaterTest.class,"showCustomStaticInfo","StaticCustom!");dele.invokeAllMethod();dele.removeMethod(ID);System.out.println("------------------------------------------------------------------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------실행 결과 :
정전기!
정적화!
관습!
Hellodelegate!
-----------------
정전기!
정적화!
관습!
다른 문제
일부 공개 방법은 동기화되어 레지스터 변수의 스레드 안전을 보장하여 여러 스레드로 인해 실수를하지 않도록합니다.
반품 값이있는 대의원에게는 경고가 발행되지만 모듈은 여전히 그러한 대표단을 받아 들일 수 있지만 대표단을 실행할 때 반환 값을 얻지 못합니다.
추가 된 대의원의 최대 값은 integer.max_value-Integer.min_value 이후의 결함 공차 프로세스입니다 (일반적으로 대의원이 필요한 기능은 많지 않습니다.
위임 된 실행은 무질서하고 성능 요구 사항이 필요한 경우 위임 된 기능을 차단하지 마십시오. 그렇지 않으면 다른 위임 된 기능의 실행에 영향을 미칩니다.
다른 질문에 대해 논의하기 위해 게시 할 수 있습니다.
요약
위의 내용은 반사를 통해 Java에서 대의원 메커니즘 코드를 구현하는 것에 대한이 기사의 모든 자세한 설명입니다. 모든 사람에게 도움이되기를 바랍니다. 관심있는 친구는이 웹 사이트에서 다른 Java 관련 주제를 계속 참조 할 수 있습니다. 단점이 있으면 메시지를 남겨 두십시오. 이 사이트를 지원해 주신 친구들에게 감사드립니다!