当前位置:文档之家› 一个例子让你了解Java反射机制

一个例子让你了解Java反射机制

一个例子让你了解Java反射机制JAVA反射机制:通俗地说,反射机制就是可以把一个类,类的成员(函数,属性),当成一个对象来操作,希望读者能理解,也就是说,类,类的成员,我们在运行的时候还可以动态地去操作他们.理论的东东太多也没用,下面我们看看实践 Demo ~Demo:1.package cn.lee.demo;2.3.import ng.reflect.Constructor;4.import ng.reflect.Field;5.import ng.reflect.InvocationTargetException;6.import ng.reflect.Method;7.import ng.reflect.Modifier;8.import ng.reflect.TypeVariable;9.10.public class Main {11. /**12. * 为了看清楚Java反射部分代码,所有异常我都最后抛出来给虚拟机处理!13. * @param args14. * @throws ClassNotFoundException15. * @throws InstantiationException16. * @throws IllegalAccessException17. * @throws InvocationTargetException18. * @throws IllegalArgumentException19. * @throws NoSuchFieldException20. * @throws SecurityException21. * @throws NoSuchMethodException22. */23. public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTa rgetException, SecurityException, NoSuchFieldException, NoSuchMethodExcept ion {24. // TODO Auto-generated method stub25.26. //Demo1. 通过Java反射机制得到类的包名和类名27. Demo1();28. System.out.println("===============================================");29.30. //Demo2. 验证所有的类都是Class类的实例对象31. Demo2();32. System.out.println("===============================================");33.34. //Demo3. 通过Java反射机制,用Class 创建类对象[这也就是反射存在的意义所在],无参构造35. Demo3();36. System.out.println("===============================================");37.38. //Demo4: 通过Java反射机制得到一个类的构造函数,并实现构造带参实例对象39. Demo4();40. System.out.println("===============================================");41.42. //Demo5: 通过Java反射机制操作成员变量, set 和 get43. Demo5();44. System.out.println("===============================================");45.46. //Demo6: 通过Java反射机制得到类的一些属性:继承的接口,父类,函数信息,成员信息,类型等47. Demo6();48. System.out.println("===============================================");49.50. //Demo7: 通过Java反射机制调用类中方法51. Demo7();52. System.out.println("===============================================");53.54. //Demo8: 通过Java反射机制获得类加载器55. Demo8();56. System.out.println("===============================================");57.58. }59.60. /**61. * Demo1: 通过Java反射机制得到类的包名和类名62. */63. public static void Demo1()64. {65. Person person = new Person();66. System.out.println("Demo1: 包名: " + person.getClass().getPackage().getName() + ","67. + "完整类名: " + person.getClass().getName());68. }69.70. /**71. * Demo2: 验证所有的类都是Class类的实例对象72. * @throws ClassNotFoundException73. */74. public static void Demo2() throws ClassNotFoundException75. {76. //定义两个类型都未知的Class , 设置初值为null, 看看如何给它们赋值成Person类77. Class<?> class1 = null;78. Class<?> class2 = null;79.80. //写法1, 可能抛出 ClassNotFoundException [多用这个写法]81. class1 = Class.forName("cn.lee.demo.Person");82. System.out.println("Demo2:(写法1) 包名: " + class1.getPackage().getName() + ","83. + "完整类名: " + class1.getName());84.85. //写法286. class2 = Person.class;87. System.out.println("Demo2:(写法2) 包名: " + class2.getPackage().getName() + ","88. + "完整类名: " + class2.getName());89. }90.91. /**92. * Demo3: 通过Java反射机制,用Class 创建类对象[这也就是反射存在的意义所在]93. * @throws ClassNotFoundException94. * @throws IllegalAccessException95. * @throws InstantiationException96. */97. public static void Demo3() throws ClassNotFoundException, InstantiationException, IllegalAccessException98. {99. Class<?> class1 = null;100. class1 = Class.forName("cn.lee.demo.Person");101. //由于这里不能带参数,所以你要实例化的这个类Person,一定要有无参构造函数哈~102. Person person = (Person) class1.newInstance();103. person.setAge(20);104. person.setName("LeeFeng");105. System.out.println("Demo3: " + person.getName() + " : " + person.ge tAge());106. }107.108. /**109. * Demo4: 通过Java反射机制得到一个类的构造函数,并实现创建带参实例对象110. * @throws ClassNotFoundException111. * @throws InvocationTargetException112. * @throws IllegalAccessException113. * @throws InstantiationException114. * @throws IllegalArgumentException115. */116. public static void Demo4() throws ClassNotFoundException, IllegalArg umentException, InstantiationException, IllegalAccessException, InvocationTarg etException117. {118. Class<?> class1 = null;119. Person person1 = null;120. Person person2 = null;121.122. class1 = Class.forName("cn.lee.demo.Person");123. //得到一系列构造函数集合124. Constructor<?>[] constructors = class1.getConstructors();125.126. person1 = (Person) constructors[0].newInstance();127. person1.setAge(30);128. person1.setName("leeFeng");129.130. person2 = (Person) constructors[1].newInstance(20,"leeFeng"); 131.132. System.out.println("Demo4: " + person1.getName() + " : " + person1.getAge()133. + " , " + person2.getName() + " : " + person2.getAge() 134. );135.136. }137.138. /**139. * Demo5: 通过Java反射机制操作成员变量, set 和 get140. *141. * @throws IllegalAccessException142. * @throws IllegalArgumentException143. * @throws NoSuchFieldException144. * @throws SecurityException145. * @throws InstantiationException146. * @throws ClassNotFoundException147. */148. public static void Demo5() throws IllegalArgumentException, IllegalAc cessException, SecurityException, NoSuchFieldException, InstantiationException , ClassNotFoundException149. {150. Class<?> class1 = null;151. class1 = Class.forName("cn.lee.demo.Person");152. Object obj = class1.newInstance();153.154. Field personNameField = class1.getDeclaredField("name");155. personNameField.setAccessible(true);156. personNameField.set(obj, "胖虎先森");157.158.159. System.out.println("Demo5: 修改属性之后得到属性变量的值:" + personNameField.get(obj));160.161. }162.163.164. /**165. * Demo6: 通过Java反射机制得到类的一些属性:继承的接口,父类,函数信息,成员信息,类型等166. * @throws ClassNotFoundException167. */168. public static void Demo6() throws ClassNotFoundException169. {170. Class<?> class1 = null;171. class1 = Class.forName("cn.lee.demo.SuperMan");172.173. //取得父类名称174. Class<?> superClass = class1.getSuperclass();175. System.out.println("Demo6: SuperMan类的父类名: " + superClass.getName());176.177. System.out.println("=================================== ============");178.179.180. Field[] fields = class1.getDeclaredFields();181. for (int i = 0; i < fields.length; i++) {182. System.out.println("类中的成员: " + fields[i]);183. }184. System.out.println("=================================== ============");185.186.187. //取得类方法188. Method[] methods = class1.getDeclaredMethods();189. for (int i = 0; i < methods.length; i++) {190. System.out.println("Demo6,取得SuperMan类的方法:"); 191. System.out.println("函数名:" + methods[i].getName()); 192. System.out.println("函数返回类型:" + methods[i].getReturnType());193. System.out.println("函数访问修饰符:" + Modifier.toString(methods[i].getModifiers()));194. System.out.println("函数代码写法: " + methods[i]);195. }196.197. System.out.println("=================================== ============");198.199. //取得类实现的接口,因为接口类也属于Class,所以得到接口中的方法也是一样的方法得到哈200. Class<?> interfaces[] = class1.getInterfaces();201. for (int i = 0; i < interfaces.length; i++) {202. System.out.println("实现的接口类名: " + interfaces[i].getName() );203. }204.205. }206.207. /**208. * Demo7: 通过Java反射机制调用类方法209. * @throws ClassNotFoundException210. * @throws NoSuchMethodException211. * @throws SecurityException212. * @throws InvocationTargetException213. * @throws IllegalAccessException214. * @throws IllegalArgumentException215. * @throws InstantiationException216. */217. public static void Demo7() throws ClassNotFoundException, SecurityE xception, NoSuchMethodException, IllegalArgumentException, IllegalAccessExc eption, InvocationTargetException, InstantiationException218. {219. Class<?> class1 = null;220. class1 = Class.forName("cn.lee.demo.SuperMan");221.222. System.out.println("Demo7: \n调用无参方法fly():");223. Method method = class1.getMethod("fly");224. method.invoke(class1.newInstance());225.226. System.out.println("调用有参方法walk(int m):");227. method = class1.getMethod("walk",int.class);228. method.invoke(class1.newInstance(),100);229. }230.231. /**232. * Demo8: 通过Java反射机制得到类加载器信息233. *234. * 在java中有三种类类加载器。

相关主题