打字猴:1.700447674e+09
1700447674
1700447675 forName方法加载,如Class.forName(“java.lang.String”)。
1700447676
1700447677 获得了Class对象后,就可以通过getAnnotations()获得注解,通过getMethods()获得方法,通过getConstructors()获得构造函数等,这为后续的反射代码铺平了道路。
1700447678
1700447679
1700447680
1700447681
1700447682 编写高质量代码:改善Java程序的151个建议 [:1700438175]
1700447683 编写高质量代码:改善Java程序的151个建议 建议102:适时选择getDeclared×××和get×××
1700447684
1700447685 Java的Class类提供了很多的getDeclared×××方法和get×××方法,例如getDeclared-Method和getMethod成对出现,getDeclaredConstructors和getConstructors也是成对出现,那这两者之间有什么差别呢?看如下代码:
1700447686
1700447687 public static void main(String[]args)throws Exception{
1700447688
1700447689 //方法名称
1700447690
1700447691 String methodName=“doStuff”;
1700447692
1700447693 Method m1=Foo.class.getDeclaredMethod(methodName);
1700447694
1700447695 Method m2=Foo.class.getMethod(methodName);
1700447696
1700447697 }
1700447698
1700447699 //静态内部类
1700447700
1700447701 static class Foo{
1700447702
1700447703 void doStuff(){}
1700447704
1700447705 }
1700447706
1700447707 此段代码运行后的输出如下:
1700447708
1700447709 Exception in thread”main”java.lang.NoSuchMethodException:Client$Foo.doStuff()
1700447710
1700447711 at java.lang.Class.getMethod(Class.java:1605)
1700447712
1700447713 at Client.main(Client.java:10)
1700447714
1700447715 该异常是说m2变量的getDeclaredMethod方法没有找到doStuff方法,明明有这个方法呀,为什么没有找到呢?这是因为getMethod方法获得的是所有public访问级别的方法,包括从父类继承的方法,而getDeclaredMethod获得是自身类的所有方法,包括公用(public)方法、私有(private)方法等,而且不受限于访问权限。
1700447716
1700447717 其他的getDeclaredConstructors和getConstructors、getDeclaredFields和getFields等与此相似。Java之所以如此处理,是因为反射本意只是正常代码逻辑的一种补充,而不是让正常代码逻辑产生翻天覆地的变动,所以public的属性和方法最容易获取,私有属性和方法也可以获取,但要限定本类。
1700447718
1700447719 那现在问题来了:如果需要列出所有继承自父类的方法,该如何实现呢?简单,先获得父类,然后使用getDeclaredMethods,之后持续递归即可。
1700447720
1700447721
1700447722
1700447723
[ 上一页 ]  [ :1.700447674e+09 ]  [ 下一页 ]