2013-04-14 4 views
4

Есть ли способ понять, какой тип будет возвращен методом, вызванным из общего класса?Какой тип будет возвращен методом, вызванным из общего класса?

Существует пример:

Generified<Integer, Double> generified = new Generified<Integer, Double>(); 
Method method = generified.getClass().getMethod("getDoubleValue"); 
Class<?> returnType = ........ 

Ok ребята, есть класс:

public class Generified<T, Z> { 
    private T tValue; 
    private Z doubleValue; 
    private List<T> tValueList; 

    public Generified() { 
    } 

    public T gettValue() { 
     return tValue; 
    } 

    public void settValue(T tValue) { 
     this.tValue = tValue; 
    } 

    public Z getDoubleValue() { 
     return doubleValue; 
    } 

    public void setDoubleValue(Z doubleValue) { 
     this.doubleValue = doubleValue; 
    } 

    public List<T> gettValueList() { 
     return tValueList; 
    } 

    public void settValueList(List<T> tValueList) { 
     this.tValueList = tValueList; 
    } 
} 

Update:

Существует поэтому я прошу:

I Я пытаюсь сделать lib, который может делать простые скопления для коллекций. Есть то, что у меня на данный момент: github.README.md

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

Но после того, как много отладки я вижу, что есть теперь способ сделать то, что я хочу, и я хочу плакать :)

+1

Вы можете проверить метод.getGenericReturnType() – jontejj

+0

Извините, ребята, исправлены опечатки – dyrkin

+0

+1 для хорошего вопроса. – NINCOMPOOP

ответ

2

Ответ очевиден из названия метода - getDoubleValue() должен возвращать Double. Но так как вы не предоставили код для этого класса, мы можем только догадываться.

Но если вы говорите, общий случай здесь, отражение может зайти так далеко: Method.getReturnType() и Method.getGenericReturnType().

UPDATE: Если проверить MethodSpy на this page и запустить его против своего класса, вы получите:

public Z Generified.getDoubleValue() 
    ReturnType: class java.lang.Object 
    GenericReturnType: Z 

Я не думаю, что вы можете найти то, что вы ищете, просто глядя в родовом классе он просто не содержит необходимой информации. Надеюсь это поможет.

+2

Что делать, если метод был назван неправильно? – NINCOMPOOP

+0

Проверьте обновленный ответ. – Cebence

+0

Cebence, спасибо. Похоже, вы правы – dyrkin

2

Вы можете объявить Generified как абстрактный класс, таким образом, чтобы создать экземпляр, вы должны использовать подкласс, и когда вы это сделаете, вы можете использовать getClass(). GetGenericSuperclass() внутри Генерированного конструктора и получить фактические параметры типа, переданные в , как:

package com.stackoverflow.q15998449; 

import java.lang.reflect.ParameterizedType; 
import java.util.List; 

public abstract class Generified<T, Z> 
{ 
    private T tValue; 
    private Z doubleValue; 
    private List<T> tValueList; 

    private final Class<Z> zType; 
    private final Class<T> tType; 

    @SuppressWarnings("unchecked") 
    public Generified() 
    { 
     ParameterizedType a = ((ParameterizedType) getClass().getGenericSuperclass()); 
     tType = (Class<T>) a.getActualTypeArguments()[0]; 
     zType = (Class<Z>) a.getActualTypeArguments()[1]; 
    } 

    public Class<T> getTReturnType() 
    { 
     return tType; 
    } 

    public Class<Z> getZReturnType() 
    { 
     return zType; 
    } 

    public T gettValue() 
    { 
     return tValue; 
    } 

    public void settValue(T tValue) 
    { 
     this.tValue = tValue; 
    } 

    public Z getDoubleValue() 
    { 
     return doubleValue; 
    } 

    public void setDoubleValue(Z doubleValue) 
    { 
     this.doubleValue = doubleValue; 
    } 

    public List<T> gettValueList() 
    { 
     return tValueList; 
    } 

    public void settValueList(List<T> tValueList) 
    { 
     this.tValueList = tValueList; 
    } 

пользователь вашего класса будет выглядеть так:

package com.stackoverflow.q15998449; 

import java.lang.reflect.Method; 

public class User 
{ 
    public static void main(String[] args) throws NoSuchMethodException, SecurityException 
    { 
     Generified<Integer, Double> generified = new Generified<Integer, Double>(){}; 
     Method method = generified.getClass().getMethod("getDoubleValue"); 
     Class<?> returnType = generified.getZReturnType(); 
    } 
} 
+0

Спасибо за ваш порт! Но я был неясно. Я не могу изменять классы.Я хочу знать тип возврата любого меток из любого класса во время выполнения. – dyrkin

+0

А, я вижу. Тогда тебе не повезло :) – jontejj

0

Я не понимаю, в чем проблема. Вы знаете от .getGenericReturnType(), что тип возврата Z. И вы знаете, что Z - второй параметр. И вы явно создаете объект с конкретным параметром, Double, в первой строке. Значит, вы точно знаете, что это такое.

Смежные вопросы