try {
for (Method method : cls.getMethods()) {
//these methods are called bridge methods
if(!method.isBridge()){
System.out.print(method.getName() + "\t");
for(Class paramCls : method.getParameterTypes()){
System.out.print(paramCls.getName() + ",");
}
System.out.println();
}
}
} catch (SecurityException e) {
// TODO Auto-generated catch block
}
UPDATE:Bridge methods
引述博客:
在Java Bridge的方法是合成方法,其对是必要的实现一些Java语言功能。已知最好的样本是 协变返回类型,以及基于 方法的参数与正在调用的实际方法不同时的泛型情况。
更新代码从上方博客:
public class SampleTwo {
public static class A<T> {
public T getT(T args) {
return args;
}
}
public static class B extends A<String> {
public String getT(String args) {
return args;
}
}
}
在编译代码将看起来像:
public SampleThree$B();
...
public java.lang.String getT(java.lang.String);
Code:
0: aload_1
1: areturn
public java.lang.Object getT(java.lang.Object);
Code:
0: aload_0
1: aload_1
2: checkcast #2; //class java/lang/String
5: invokevirtual #3; //Method getT:(Ljava/lang/String;)Ljava/lang/String;
8: areturn
}
桥方法,它从基类重写方法“A “,而不是 只是调用一个带字符串参数(#3),但也执行类型 强制转换到“java.lang.String”(#2)。这意味着,如果你将执行 下面的代码,忽略编译器的“选中”的警告,结果 将抛出ClassCastException从桥上方法抛出:
A a = new B();
a.getT(new Object()));
展望“什么是电桥法”了。 – StarPinkER 2013-03-07 10:45:47
阅读本教程,它为博客链接解释了所有内容:http://docs.oracle.com/javase/tutorial/java/generics/erasure.html – Muel 2013-03-07 10:47:49