getTypeParameters возвращает нулевой массив TypeVariable - PullRequest
3 голосов
/ 23 марта 2011

Я пишу программу, которая отображает методы внутри класса вместе с модификатором доступа, типом возвращаемого значения и параметрами.

Вот мой код

import java.lang.reflect.*;
class RefTest1{

    public static void main(String[] args) throws Exception{
        Test obj = new Test();      
        Class<?> c = obj.getClass();

        System.out.printf("%n%s fields :-%n", obj.getClass());

        Field[] fields = c.getDeclaredFields();

        for(Field f : fields){
            f.setAccessible(true);
            int m = f.getModifiers();

            if(Modifier.isStatic(m)){
                System.out.printf("%s is static variable and its value is %s%n", f.getName(), f.get(obj));
            }else if(Modifier.isPublic(m)){
                System.out.printf("%s is public variable and its value is %s%n", f.getName(), f.get(obj));
            }else if(Modifier.isPrivate(m)){
                System.out.printf("%s is private variable and its value is %s%n", f.getName(), f.get(obj));
            }else if(Modifier.isProtected(m)){
                System.out.printf("%s is protected variable and its value is %s%n", f.getName(), f.get(obj));
            }
        }
        System.out.printf("%n%s methods :-%n", obj.getClass());     

        Method[] methods = c.getDeclaredMethods();

        for(Method meth : methods){
            int m = meth.getModifiers();
            meth.setAccessible(true);
            if(Modifier.isStatic(m)){
                System.out.printf("%s is static method%n", meth.getName());
            }else if(Modifier.isPublic(m)){
                System.out.printf("%s is public method%n", meth.getName());
            }else if(Modifier.isPrivate(m)){
                System.out.printf("%s is private method%n", meth.getName());
            }else if(Modifier.isProtected(m)){
                System.out.printf("%s is protected method%n", meth.getName());
            }

            System.out.printf("%nReturn Type :- %s%n", meth.getReturnType());
            System.out.printf("%nParameters:-%n");
            TypeVariable[] parameters = meth.getTypeParameters();

            for(TypeVariable param : parameters){
                System.out.printf("%s", param.getName());
            }


        }
        System.out.println();

    }

}

Test.java

class Test{

    private int x;
    public double y;
    protected String z;
    static long a;

    public Test(){
        x = 10;
        y = 20;
        z = "Hello";
        a = 15L;

    }

    public void Print(String a){
        a = a;
        System.out.println("Executing Print function.");
    }

    private void hidden(double b){
        b = b; 
        //private function
    }
}

Все работает нормально, но я не понимаю, почему я получаю пустой массив TypeVariable в строке TypeVariable[] parameters = meth.getTypeParameters();

Может ли кто-нибудь указать мне правильное направление?

Спасибо.

Ответы [ 2 ]

11 голосов
/ 23 марта 2011

getTypeParameters() возвращает массив параметров типа , используемых в определении метода. не возвращает массив типов аргументов.Рассмотрим этот метод:

 public <T> void foo(int bar);

getTypeParameters() вернет массив, содержащий T (то есть TypeVariable с именем T и границами { Object.class }).

getParameterTypes() однако вернет массив, содержащий int.class.

Примечание: если ваши типы параметров содержат параметры типа, вам нужно будет использовать getGenericParameterTypes().

1 голос
/ 23 марта 2011

Я думаю, вы должны использовать getParameterTypes(), который возвращает Class[]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...