forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Android (http://forum.boolean.name/forumdisplay.php?f=150)
-   -   Рефлексия (http://forum.boolean.name/showthread.php?t=15642)

pax 12.10.2011 12:51

Рефлексия
 
Возможно ли получить список классов программно, получить имена полей классов, имена методов и их параметры?

Есть желание сделать для Unity генератор объектно-ориентированных оберток необходимых классов...

Подскажите куда копать?

moka 12.10.2011 13:39

Ответ: Рефлексия
 
В Java есть рефлекция, вот гугл выдал первую ссылку, вроди то что тебе нужно:
http://mobile.tutsplus.com/tutorials...va-reflection/

По поводу обёртнок, можно задуматься о разработке некоего API для игр, если собираешься использовать в более чем одном проекта, используя NDK, на C++.

Если используется MonoDroid, то он имеет .Net рефлекцию (аналогичная C# .Net)

pax 12.10.2011 13:51

Ответ: Рефлексия
 
Мне необходимо под Unity иметь доступ к нужным классам Java/Android с использованием C# объектов. Лень каждый раз вспоминать аргументы функций для вызова методом
PHP код:

var jo = new AndroidJavaObject("java.lang.String");
var 
valueString jo.CallStatic<string>("valueOf"42.0f); 

а иметь готовый C# класс - обертку для всех методов и полей класса Java.

Это сэкономит кучу времени.

Пример такого класса:
PHP код:

namespace java.lang
{
  public class 
String
  
{
      public static 
System.String valueOf(float param)
      {
           var 
jo = new AndroidJavaObject("java.lang.String");
           return 
jo.CallStatic<System.String>("valueOf"param);
      }
  }


и потом работать с ним как
PHP код:

var valueString java.lang.String.valueOf(42.0f); 


moka 12.10.2011 14:29

Ответ: Рефлексия
 
Воу... Это будет медленно же, если везде заменить это дело таким образом и вызывать в динамике.
Думаю можно было бы реализовать что-то более шустрое, хз как но вот пример как бы я реализовал, если бы компилил под разные платформы.
Код:

#define JAVA

namespace Platform {
    public class String {
        delegate string MethodValueOf(float number);

        private static MethodValueOf valueOf;
        public static MethodValueOf ValueOf {
            get {
                if (valueOf == null) {
                    #if JAVA
                        valueOf = delegate(float number) {
                            var javaObj = new AndroidJavaObject("java.lang.String");
                            return javaObj.CallStatic<System.String>("valueOf", number);
                        };
                    #elif CSHARP
                        valueOf = delegate(float number) {
                            return number.ToString();
                        };
                    #endif
                }
                return valueOf;
            }
        }
    }
}

И использовать так:
Код:

var valueString = Platform.String.ValueOf(10.0f);
Получается singleton delegate, при этом который будет инициализироваться при первом вызове. Можно конечно это дело обернуть в убер функцию "Initialize", и объявлять все делегаты при включении приложения если так будет удобнее.
Тут используется define чтобы определить платформу, в Unity есть даже для этого уже стандартные дефайны.
По мне так удобно в юзабилити, хотя зависит от тебя. Тут ещё нужно подумать над разными типами данных, т.к. delegate'ы нельзя overload'ить. Но в пользовании у тебя будет одна функция, на разные платформы. Думаю это очень сократит время в разработки игры сразу с мультиплатформенным кодом. Но, это требует создания таких вот делегатов для этих самых функций..

Готовых не видел, и думаю будет весьма сложно это как-то автоматизировать, т.к. методы все разные, по разному используются..

UPD:
Можно ещё кешировать AndroidJavaObject, т.к. он используется для доступа к статическим функциям. Для этого можно сделать статичный менеджер с хешь таблицей для доступа к объекту по имени, будет типо такого: ObjectManager.CallStatic("string", "valueOf", number);
Заместо двух строк. При этом прописать в аттрибутах самого Accessor'а все нужные данные, тип объекта, путь к классу. Получается что менеджер кеширует это дело при включении (прбежиться по акксессорам, и создаст яваобъекты), далее в теле будет проще это вызывать.
Хотя имхо, это не улучшит сильно ситуацию, единственное что это кеширует яваобъект, в остальном лишь ухудшит.

pax 12.10.2011 15:25

Ответ: Рефлексия
 
Пример который я привел не имеет никакой практической ценности и меня не интересует быстродействие разовых методов. Все классы Android платформы будут использоваться несколько раз в процессе всей работы приложения.

То что я не не сделал в примере статический конструктор для класса, в котором бы создал экземпляр для вызова статических методов - не хотел нагружать кодом.

Классы Android платформы будут применяться только для проектов под эту платформу. Поэтому никаких платформо-зависимых компиляций не будет.


Часовой пояс GMT +4, время: 19:21.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot