Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Создание адаптера для java класса, Генерация в runtime 
:(
    Опции темы
Dude03
Дата 29.4.2008, 18:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 257
Регистрация: 28.4.2006

Репутация: нет
Всего: 6



Вот у меня есть два таких класса. Пример утрированный специально=)

Код

public class A {
    int a;

    public int getA() {
        return a;
    }
    
    public void setA(int a) {
        this.a = a;
    }
}

public class B {
    int a;

    public int getA() {
        return a;
    }
    
    public void setA(int a) {
        this.a = a;
    }
}

public C {
   public static void process(A a) {
      a.setA(1);
   }
}


Хочеться получить автоматом в runtime вот это:
Код

public class D extends A {
    private B b;

    public int getA() {
        return b.getA();
    }
    
    public void setA(int a) {
        this.b.setA(a);
    }
}

То есть чтобы это все нормально работало в методом C.process ...
Или получить тот же эффект другим способом.
Название поле и в А, и в В совершенно одинаковые и названия методов следуют javabean соглашению.

ЗЫ. почему-то я уверен, что есть готовое решение=).



Это сообщение отредактировал(а) Dude03 - 29.4.2008, 18:52
PM MAIL   Вверх
ivg
Дата 29.4.2008, 20:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Autonomous R&D
**


Профиль
Группа: Участник
Сообщений: 686
Регистрация: 8.2.2006
Где: Екатеринбург

Репутация: 33
Всего: 81



Класс D нужно сгенерировать в runtime? А зачем? Слишком много классов типа A и B для которых нужно это сделать? Если так тогда Proxy может помочь.
Если нет, добавьте в класс D конструктор, который будет принимать объект класса B и соответственно вызывайте
Код

B b = .....
C.process(new D(b));

PM MAIL   Вверх
Dude03
Дата 29.4.2008, 22:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 257
Регистрация: 28.4.2006

Репутация: нет
Всего: 6



Да, классов достаточно. Не хочется мараться. Механизм proxy из jdk работают только при реализации классом некоторого интерфейса. 

Нашел класс Enchancer из cglib и для него можно написать interceptor. Все будет тип-топ.
Но писать не хочется. Не в том смысле, что мне лень(тем более что я уже написал ;-) ) , а в том, что не хочется включать новые классы в проект. Вот...

Код

import java.lang.reflect.Method;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;


class A {
    int a;
    public int getA() {
        return a;
    }
    
    public void setA(int a) {
        this.a = a;
    }
}

class B {
    int b;
    public int getA() {
        return b;
    }
    
    public void setA(int a) {
        this.b = a;
    }
}

class C {
    public static void process(A a) {
        a.setA(1);
    }
}


class I implements MethodInterceptor {

    private Object o;
    private Class realClass;
    
    public I(Object o, Class clazz) {
        this.o = o;
        realClass = clazz;
    }
    
    public Object intercept(Object arg0, Method arg1, Object[] arg2, MethodProxy arg3) throws Throwable {
        return realClass.getMethod(arg1.getName(), arg1.getParameterTypes()).invoke(o, arg2);
    }

}

public class Main   {

    public static void main(String[] args) throws Exception {
        B b = new B();
        b.setA(2);
        I interceptor = new I(b, B.class);
        Enhancer e = new Enhancer();
        e.setSuperclass(A.class);
        e.setCallback(interceptor);
        Object bean = e.create();
        C.process((A) bean);
        System.out.println(b.getA());
    }
    
}



Может кто-нить может предложить лучшую реализацию? очень надо=)

Это сообщение отредактировал(а) Dude03 - 29.4.2008, 22:33
PM MAIL   Вверх
w1nd
Дата 3.5.2008, 04:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 22.3.2006
Где: Москва

Репутация: 20
Всего: 54



Если вам нужно извлечь из любого класса, невзирая на его тип, определённое свойство - рефлексия вас спасёт.


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0672 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.