用反射调用有某个注解的方法

JAVAkuroro 2011-09-26 09:39:48
我想实现的功能是通过run调用Test注解的不带参数无返回值的方法 为什么不能打印出来 invoke难道没执行么?
RUN类代码如下:
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[]{});
}
}
}
}

注解代码如下

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

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

}

测试类代码如下
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);
}
}
...全文
187 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
JAVAkuroro 2011-09-27
  • 打赏
  • 举报
回复
终于弄出来了 改成 if("void"==method.getReturnType().getName() && 0==method.getParameterTypes().length)
method.invoke(obj,new Object[]{});
就好了
oO临时工Oo 2011-09-27
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 javakuroro 的回复:]

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

if(method.getReturnType().equals(void.class)){
System.out.println(method + " \t " + method.getReturnType());
}
JAVAkuroro 2011-09-26
  • 打赏
  • 举报
回复
大概的原因 我知道了 就是不知道如何判断方法的返回为void,并且是无参的 系统认为我的run方法是把所有含有Test注解的方法输出 ,我用Invoke时没传参 有的方法有参数 所以产生参数异常。谁知道争样通过反射中的getReturnType()来判断方法返回类型是不是void?
beowulf2005 2011-09-26
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 zhouyuqwert 的回复:]

你没判断参数个数就执行。。。add(int ,int)执行的时候出错了
[/Quote]
+1
oO临时工Oo 2011-09-26
  • 打赏
  • 举报
回复
注解Test要改成

@Retention(RetentionPolicy.RUNTIME)
@interface Test {
}


但是由于你每个方法的参数不是一样的,所以全部都用
method.invoke(obj,new Object[]{});
来执行是不行的,
如果全部是对象,又不怕空指针异常可以这样

method.invoke(obj, new Object[method.getGenericParameterTypes().length]);

但这个也不全行,那个add(int ,int)方法就会报错,因为传入的参数是NULL,NULL-> int 就异常了

LZ自己再作修改
oO临时工Oo 2011-09-26
  • 打赏
  • 举报
回复
本来就没有

for (Object ob : method.getAnnotations()) {
System.out.println(ob);
}

一个也找不出来
圣杰韩韦 2011-09-26
  • 打赏
  • 举报
回复

这个程序并不是最好的,有些还可以改进
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);
}
}




阳明 to life 2011-09-26
  • 打赏
  • 举报
回复
你没判断参数个数就执行。。。add(int ,int)执行的时候出错了
JAVAkuroro 2011-09-26
  • 打赏
  • 举报
回复
加了@Retention(value=RUNTIME)后就会出现一个异常
Exception in thread "main" java.lang.IllegalArgumentException: wrong number of arguments
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at ApplicationRun.run(ApplicationRun.java:14)
at MyClass.main(MyClass.java:32)
[Quote=引用 2 楼 zhouyuqwert 的回复:]

是不是Test注解类少了@Retention(value=RUNTIME)
[/Quote]
阳明 to life 2011-09-26
  • 打赏
  • 举报
回复
是不是Test注解类少了@Retention(value=RUNTIME)
JAVAkuroro 2011-09-26
  • 打赏
  • 举报
回复
在线等

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧