打字猴:1.700447657e+09
1700447657 其对象都是单例模式。一个Class的实例对象描述一个类,并且只描述一个类,反过来也成立,一个类只有一个Class实例对象,如下代码返回的结果都为true:
1700447658
1700447659 //类的属性class所引用的对象与实例对象的getClass返回值相同
1700447660
1700447661 String.class.equals(new String().getClass())
1700447662
1700447663 “ABC”.getClass().equals(String.class)
1700447664
1700447665 //class实例对象不区分泛型
1700447666
1700447667 ArrayList.class.equals(new ArrayList<String>().getClass()))
1700447668
1700447669 Class类是Java的反射入口,只有在获得了一个类的描述对象后才能动态地加载、调用,一般获得一个Class对象有三种途径:
1700447670
1700447671 类属性方式,如String.class。
1700447672
1700447673 对象的getClass方法,如new String().getClass()。
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
[ 上一页 ]  [ :1.700447657e+09 ]  [ 下一页 ]