Краткое описание
Я всегда беспокоился об отсутствии механизма готового делегирования Java. К счастью, у меня недавно есть время, и я написал простой модуль делегирования с отражением для справки.
Модуль API
Общедоступный класс DeLegater () // Построение пустого параметра, этот класс управляет экземпляром делегата и реализует метод делегата // Добавить статический метод делегата и возвращает идентификатор целочисленного значения, чтобы представить экземпляр, состоящий из метода и параметров. Если это не удается, верните -1. public Synchronized int AddFunctionDelegate (Class <?> SrcClass, String Methodname, Object ... Params); // Добавить делегируйте метод экземпляра, верните идентификатор целочисленного значения, чтобы представить экземпляр, состоящий из метода и параметров. Если это не удается, верните -1. public Synchronized int addfunctionDelegate (Object SrCobj, String Methodname, Object ... Params); // Удалить метод делегирования из экземпляра делегата на основе целочисленного идентификатора и возврата, независимо от того, является ли он успешным общедоступным синхронизированным логическими invokeallMethod (); // Преобразование таблицы параметров в таблицу типа параметров Private Class <?> [] getParamTypes (Object [] params); // Получить отдельный метод метода из указанного класса, имя метода и таблица типа параметров private method getDstmethod (класс <?> srcclass, string methodname, class <?> paramtypes); Params) // класс DelegateNode описывает статическое делегирование метода, когда не использует конструкцию объекта, включая экземпляры метода и таблицы параметров. Класс DelegateNode (Object srcobj, Method refmethod, Object [] params) // класс делегатенода описывает делегирование метода экземпляра при использовании построения объекта, включая экземпляры класса, экземпляры метода и таблицы параметров public void (); // Делегирование метода, которое выполняет описание узла.
исходный код
Импорт java.lang.reflect.invocationTargetException; Import java.lang.reflect.method; Import java.util.hashtable;/** Класс делегатора использует RTTI и размышления для реализации механизма делегата в java*@author Three-Brick*/public class Delegater {static intalege. variable hashtable <integer, delegateNode> nodetable; // Управление идентификатором и контейнер соответствующего делегата public delegater () {nodetable = new Hashtable <Integer, Delegatenode> ();} // Добавить статический метод Delegate public synchronized int addfunctDelegate (класс <?> srcclass, string, string, int -params -methods, ... string, string, ... string, string, string, string, string, string, string, string, string, string, string, string, int. {Class <?> [] Paramtypes = getParamTypes (params); Method refmethod; if ((refmethod = getDstmethod (srcclass, methodname, paramtypes))! = Null) {register ++; nodetable.put (regired, new delegatenode (refmethod, params)); register {regress {register {regress {resgre -1; Метод делегируйте публичный синхронизированный int addFunctionDelegate (Object srcobj, String Methodname, Object ... Params) {class <?> [] paramtypes = getParamTypes (params); метод рефметод; if ((refmethod = getDstmethod (srcobj.getClass (), метод, параметры)! {Register ++; nodetable.put (register, new DelegateNode (srcobj, refmethod, params)); return register;} else {return -1;}} // Удалить метод делегировать публичный синхронный Boolean RemoveMethod (int registerId) {if (nodetable.containskey (register) {nodetable.r; false;} // Выполнить метод делегата Непопопомопочно общедоступный синхронизированный void invokeallmethod () {for (delegatenode node: nodetable.values ()) {node.invokemethod ();}} // Преобразование таблицы параметров в таблицу параметров private <?> [] getParampes (object) {jembers) [? = новый класс <?> [params.length]; for (int i = 0; i <params.length; i ++) {paramtypes [i] = params [i] .getClass ();} return paramtypes;} // Получить экземпляр метода на основе экземпляра класса класса, и название метода и таблица типа параметра getDStmethod (класс <?> srcclass, String, String, String, String, Class, Classe, Classe, Classpes <?> SrcClass, String, String, String, String, String, String, String, String, String, Classpes, Classpes, Classpes <? {Метод result = null; try {result = srcclass.getmethod (methodname, paramtypes); if (result.getreturntype ()! = Void.class) {System.out.println ("Warning, метод:"+methodname+"имеет возвращаемое значение!"); {System.out.println («Не может найти метод:«+methodname+», убедитесь, что он существует и видимо!»);} Return result;}} класс DelegateNode {Object srcobj; Method refmethod; Object [] params; public delegateNode (метод рефметод, объект [] params) {this.refmethod = refmethod; this.params = params;} public delegatenode (Object srcobj, метод refmethod, object [] params) {this.srcobj = srcobj; this.refmethod = refmethod; this.params = params;} public void invokemethod () {try {refmethod.invoke (srcobj, params);} catch (allogalaccessexception | allodalargumentException | vlococationTargetException e) {System.out.println ("Метод:"+Refmethod.tostring e) {out.println ("Метод:"+Refmethod.tostring ()+")Модульное тестирование
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 delgate!") ShowCustomStaticInfo (string info) {system.out.println (info);} public static void main (string [] args) {delegater dele = new Delegater (); DelegaterTest tester = new DelegaterTest (); int id = dele.addfunctionDelegate (tester, "showinfo"); dele.addfunctionDelegate (tester, "showcustominfo", "custom!"); dele.addfunctionDelegate (delegatertest.class "ShowStaticInfo"); dele.AddFunti onDelegate(DelegaterTest.class,"showCustomStaticInfo","StaticCustom!");dele.invokeAllMethod();dele.removeMethod(ID);System.out.println("------------------------------------------------------------------------------------------------------------------------------------------------------- -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------Результаты исполнения:
Staticcustom!
StaticDelegate!
Обычай!
Hellodelegate!
-------------------
Staticcustom!
StaticDelegate!
Обычай!
Другие вопросы
Некоторые публичные методы используют синхронизированный, чтобы обеспечить безопасность потока переменных регистра, чтобы они не совершали ошибок из -за нескольких потоков.
Предупреждение будет выдано для делегатов с возвратными значениями, но модуль все еще принимает такие делегации, но вы не получите возвращаемого значения при выполнении делегирования.
Максимальное значение добавленного делегата-это процесс толерантности к ошибкам после integer.max_value-integer.min_value не рассматривается (как правило, не так много функций, которые требуют делегата.
Делегированное выполнение является неупорядоченным, и когда требуются требования к производительности, постарайтесь не блокировать делегированную функцию, в противном случае это повлияет на выполнение других делегированных функций.
Любые другие вопросы могут быть опубликованы для обсуждения.
Суммировать
Выше приведено подробное объяснение этой статьи о реализации кода механизма делегата в Java посредством размышлений. Я надеюсь, что это будет полезно для всех. Заинтересованные друзья могут продолжать ссылаться на другие темы, связанные с Java на этом веб-сайте. Если есть какие -либо недостатки, пожалуйста, оставьте сообщение, чтобы указать это. Спасибо, друзья, за вашу поддержку на этом сайте!