Class的getMethod方法无法获得Method对象!!

wangyunquan 2010-01-27 02:35:23
public static void main (String [] args)

{try
{
String name=new String("ss").getClass().getName();
Class<?> className=Class.forName(name);
Method method=method=className.getMethod("valueOf", className);
System.out.print(method);
}
catch(Exception e)
{
e.printStackTrace();
}
}

这样的话总是打印出java.lang.NoSuchMethodException:

有人知道该怎么才能获取method吗?
...全文
2805 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
bunrise 2010-01-27
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 wangyunquan 的回复:]
楼上的

java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.Class;

强制转换出了问题
[/Quote]

Object[] a = joinPoint.getArgs();;
Class[] o = new Class[] {};//
for (int i = 0; i < a.length; i++) {
o[i] = a[i].getClass();
}
windgh 2010-01-27
  • 打赏
  • 举报
回复
是System.arraycopy,大小写错了

Class[] cs = new Class[args.length];
for (int i=0;i<args.length;i++) {
cs[i] = args[i].getClass();
}
windgh 2010-01-27
  • 打赏
  • 举报
回复
getMethod(methodName, new Class[]{})这样写是获取参数为空的方法
好像没什么好办法,for循环赋值

不过,你可以这样
Method m = Class.class.getMethod("getMethod", new Class[]{String.class, new Class[]{}.getClass()});
Object[] ta = new Object[args.length+1];
ta[0] = methodName;
System.arrayCopy(args, 0, ta, 1, args.length);
Method method = (Method)m.invoke(className, ta);

上面只是一种解决方案,不是提倡这样做,呵呵
wangyunquan 2010-01-27
  • 打赏
  • 举报
回复
楼上的

java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.Class;

强制转换出了问题
bunrise 2010-01-27
  • 打赏
  • 举报
回复
List<Class> a = new ArrayList<Class>();
Object[] o = null;// joinPoint.getArgs();
for (Object object : o) {
a.add(object.getClass());
}
Class[] c = (Class[]) a.toArray();
wangyunquan 2010-01-27
  • 打赏
  • 举报
回复
在aop中
Object[] args=joinPoint.getArgs();
传入的joinPoint 能够得到所有的参数的数组对象

通过 String methodName=joinPoint.getSignature().getName();
能够得到methodName


接下来 Method method=className.getMethod(methodName, new Class[]{});
当中的第二个参数是需要的是Class形式的数组,
怎么把Object[]转换成Class[] 呢?


boy00fly 2010-01-27
  • 打赏
  • 举报
回复
楼上说的对。在API中已经说得很清楚了。

public Method getMethod(String name,
Class<?>... parameterTypes)
throws NoSuchMethodException,
SecurityException返回一个 Method 对象,它反映此 Class 对象所表示的类或接口的指定公共成员方法。name 参数是一个 String,用于指定所需方法的简称。parameterTypes 参数是按声明顺序标识该方法形参类型的 Class 对象的一个数组。如果 parameterTypes 为 null,则按空数组处理。
如果 name 是 "<init>;" 或 "<clinit>",则将引发 NoSuchMethodException。否则,要反映的方法由下面的算法确定(设 C 为此对象所表示的类):

在 C 中搜索任一匹配的方法。如果找不到匹配的方法,则将在 C 的超类上递归调用第 1 步算法。
如果在第 1 步中没有找到任何方法,则在 C 的超接口中搜索匹配的方法。如果找到了这样的方法,则反映该方法。
在 C 类中查找匹配的方法:如果 C 正好声明了一个具有指定名称的公共方法并且恰恰有相同的形参类型,则它就是反映的方法。如果在 C 中找到了多个这样的方法,并且其中有一个方法的返回类型比其他方法的返回类型都特殊,则反映该方法;否则将从中任选一个方法。
注意,类中可以有多个匹配方法,因为尽管 Java 语言禁止类声明带有相同签名但不同返回类型的多个方法,但 Java 虚拟机并不禁止。这增加了虚拟机的灵活性,可以用来实现各种语言特性。例如,可以使用桥方法 (brige method)实现协变返回;桥方法以及将被重写的方法将具有相同的签名,不同的返回类型。

请参阅Java 语言规范 第 8.2 和 8.4 节。


参数:
name - 方法名
parameterTypes - 参数列表
windgh 2010-01-27
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 wangyunquan 的回复:]
对啊 ,因为我用的是Spring 的AOP来实现日志,
而日志的话是拦截方法上的注释来生成的,所以说方法肯定都不一样的啊

我用到时的代码是这样的,
        String temp=joinPoint.getStaticPart().toShortString();
        String classType=joinPoint.getTarget().getClass().getName();

        String methodName=temp.substring(temp.indexOf(".")+1 , temp.length()-1);

        int endIndex=methodName.lastIndexOf("(");
        String methodStringName=methodName.substring(0, endIndex);
      Class <?> className=Class.forName(classType);
        Method method=className.getMethod(methodStringName, new Class[]{});

[/Quote]

你的methodStringName没有trim(),可能带了空格
另外,如果是取没有参数的method,可以用getMethod(methodName, null),可以少创建一个数组对象
windgh 2010-01-27
  • 打赏
  • 举报
回复
String类没有valueOf(String)这个方法
bayougeng 2010-01-27
  • 打赏
  • 举报
回复
去查API。
要找方法,肯定要知道方法名,方法参数的个数,以及每个参数的类型的。
在jdk5.0里,是这样:
public Method getMethod(String name,Class... parameterTypes)
按顺序把每个参数的类型列出来。
Sou2012 2010-01-27
  • 打赏
  • 举报
回复
public class Main {
public static void main(String[] args) {
try {
String name = new String("ss").getClass().getName();
Class[] param = { Object.class };
Method method = Class.forName(name).getMethod("valueOf", param);

System.out.print(method);

} catch (Exception e) {
e.printStackTrace();
}

Class c = null;
try {
c = Class.forName("java.lang.String");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}

Method[] methods = c.getDeclaredMethods();
for (int i = 0; i < methods.length; i++) {
if (methods[i].getName().equals("valueOf")) {
System.out.println("valueOf");
}
}
}
}
bunrise 2010-01-27
  • 打赏
  • 举报
回复
getMethods()
getDeclaredMethods()
都可以获取一个类你的方法,循环一下找到你要的方法

或者楼上所说用Annotation标记一下

getDeclaredMethods().getAnnotation(param)来获取
不过有点麻烦
Sou2012 2010-01-27
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 wangyunquan 的回复:]
对啊 ,因为我用的是Spring 的AOP来实现日志,
而日志的话是拦截方法上的注释来生成的,所以说方法肯定都不一样的啊

我用到时的代码是这样的,
        String temp=joinPoint.getStaticPart().toShortString();
        String classType=joinPoint.getTarget().getClass().getName();

        String methodName=temp.substring(temp.indexOf(".")+1 , temp.length()-1);

        int endIndex=methodName.lastIndexOf("(");
        String methodStringName=methodName.substring(0, endIndex);
      Class <?> className=Class.forName(classType);
        Method method=className.getMethod(methodStringName, new Class[]{});

[/Quote]

Annotation 可以取方法名和参数等信息
wangyunquan 2010-01-27
  • 打赏
  • 举报
回复
对啊 ,因为我用的是Spring 的AOP来实现日志,
而日志的话是拦截方法上的注释来生成的,所以说方法肯定都不一样的啊

我用到时的代码是这样的,
String temp=joinPoint.getStaticPart().toShortString();
String classType=joinPoint.getTarget().getClass().getName();

String methodName=temp.substring(temp.indexOf(".")+1 , temp.length()-1);

int endIndex=methodName.lastIndexOf("(");
String methodStringName=methodName.substring(0, endIndex);
Class<?> className=Class.forName(classType);
Method method=className.getMethod(methodStringName, new Class[]{});
rosewj1986 2010-01-27
  • 打赏
  • 举报
回复
学习。。
Sou2012 2010-01-27
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 wangyunquan 的回复:]
但是有一个问题
getMethod("valueOf", param);

在应用中,我的方法名也是不固定的啊,那后面的参数该怎么弄呢?
[/Quote]

难道你的方法名会“变" ? 一会是 GetA 一会是 GetB 么?
wangyunquan 2010-01-27
  • 打赏
  • 举报
回复
也许还是多个参数
wangyunquan 2010-01-27
  • 打赏
  • 举报
回复
但是有一个问题
getMethod("valueOf", param);

在应用中,我的方法名也是不固定的啊,那后面的参数该怎么弄呢?
wangyunquan 2010-01-27
  • 打赏
  • 举报
回复
我明白了,是不是getMethod("valueOf", param);
当中的第二个参数是第一个参数(方法)接受的参数
Sou2012 2010-01-27
  • 打赏
  • 举报
回复
楼主你没设置参数。。。
加载更多回复(4)

62,614

社区成员

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

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