标签:pcl app get load 关系 protected getname efault tcl
个人学习反射的过程记录在这里:
一:先学习了Class这个类的一些基本知识。
Class这个类是为了来描述其他类的。一个Class类的对象实际上就是一个类(个人理解)。
每个类都有一个对应的该类的一个对象。它是由系统创建的。此时不管我定义几个Class类的对象。
它都会指向同一个对象。
1 // 创建Class对象实例的三种方式。 2 // 1.类名.class 3 Class clazz = Person.class; 4 // 2.对象.getClass() 5 Class clazz1 = new Person().getClass(); 6 // 3.Class.forName("全类名") 用的最多也最普遍。java开发中的诸多框架都用到了反射机制。 7 Class clazz2 = Class.forName("com.company.reflection.Demo"); 8 System.out.println(clazz == clazz1 && clazz1 == clazz2); 9 // 打印结果为true.说明该类的在jre中的对象确实只有一个,它是由系统创建的。 10 }
二:学习一下三种级别的类加载器。三个类加载器的继承关系也一目了然。
// 系统类加载器 ClassLoader classLoader = this.getClass().getClassLoader(); System.out.println(classLoader);//sun.misc.Launcher$AppClassLoader@14ae5a5 // 扩展类加载器 classLoader = classLoader.getParent(); System.out.println(classLoader);//sun.misc.Launcher$AppClassLoader@14ae5a5 // 引导类加载器(c++写的,无法获取) System.out.println(classLoader.getParent());//null
三:然后学习了constructor类,该类包含了反射过程执行中获取构造器的信息。
Class clazz = Class.forName("com.company.reflection.Demo"); Constructor[] constructors = clazz.getConstructors(); for (Constructor constructor : constructors) { System.out.println(constructor); // public com.infosys.reflection.Person() // public com.infosys.reflection.Person(java.lang.String,int,double)
}
四:接着学习了Method类。
Class clazz = Class.forName("com.company.reflection.Demo"); // 获取所有public的方法,包括父类的方法。 Method[] methods = clazz.getMethods(); for (Method method : methods) { System.out.println("^^" + method.getName()); // ^^toString // ^^getName // ^^setName // ^^getAge // ^^getSalary // ^^setSalary // ^^setAge // ^^wait // ^^wait // ^^wait // ^^equals // ^^hashCode // ^^getClass // ^^notify // ^^notifyAll }
// 只获取当前类中声明的方法。并且私有方法也可以获取。 Method[] methods2 = clazz.getDeclaredMethods(); for (int i = 0; i < methods2.length; i++) { System.out.println("__" + methods2[i].getName()); // __toString // __getName // __setName // __getAge // __getSalary // __setSalary // __setAge // __privateMethod //__protectedMethod //__defaultMethod
五:学习Field类。
Class clazz = Person.class; Field [] fields = clazz.getDeclaredFields(); for(Field f : fields){ System.out.println(f); //public java.lang.String com.infosys.reflection.Person.nickName //private java.lang.String com.infosys.reflection.Person.name //private int com.infosys.reflection.Person.age //private double com.infosys.reflection.Person.salary } Field [] fields2 = clazz.getFields(); for(Field field : fields2){ System.out.println(field); //public java.lang.String com.infosys.reflection.Person.nickName }
标签:pcl app get load 关系 protected getname efault tcl
原文地址:http://www.cnblogs.com/somary/p/6798707.html