日期:2014-05-20  浏览次数:20737 次

用反射调用有某个注解的方法
我想实现的功能是通过run调用Test注解的不带参数无返回值的方法 为什么不能打印出来 invoke难道没执行么?
RUN类代码如下:
Java code
import java.lang.reflect.Method;

public class ApplicationRun
{
      public void run(String className) throws Exception
     {
        Class<?> classtype = Class.forName(className);
        Object obj = classtype.newInstance();
        Method[] methods = classtype.getMethods();
        for(Method method:methods)
        {
         if (method.isAnnotationPresent(Test.class))
         {
             method.invoke(obj,new Object[]{});
         }
        }
     }
}


注解代码如下
Java code

import java.lang.annotation.ElementType;
import java.lang.annotation.Target;

@Target(ElementType.METHOD)
public @interface Test
{
    
}


测试类代码如下
Java code
import java.lang.reflect.InvocationTargetException;


public class MyClass
{
     public void method1()
     {
         System.out.println("method1");
     }
    @Test
    public void method2()
    {
        System.out.println("method2");
    }
    @Test
    public int add(int a,int b)
    {
        return a+b;
    }
    @Test
    public void doSomething(String str)
    {
        System.out.println(str);
    }
    @Test
    public void doSomething2()
    {
        System.out.println("doSomething2()");
    }
    public static void main(String[] args) throws Exception
    {
        String className = MyClass.class.getName();
        ApplicationRun testRun = new ApplicationRun();
        testRun.run(className);
    }
}



------解决方案--------------------
是不是Test注解类少了@Retention(value=RUNTIME)

------解决方案--------------------
探讨

大概的原因 我知道了 就是不知道如何判断方法的返回为void,并且是无参的 系统认为我的run方法是把所有含有Test注解的方法输出 ,我用Invoke时没传参 有的方法有参数 所以产生参数异常。谁知道争样通过反射中的getReturnType()来判断方法返回类型是不是void?