原文地址:http://blog.csdn.net/ljphhj/article/details/12858767

JAVA反射机制:

 

通俗地说,反射机制就是可以把一个类,类的成员(函数,属性),当成一个对象来操作,希望读者能理解,也就是说,类,类的成员,我们在运行的时候还可以动态地去操作他们.

理论的东东太多也没用,下面我们看看实践 Demo ~

 

  1. import java.lang.reflect.Constructor;
  2. import java.lang.reflect.Field;
  3. import java.lang.reflect.InvocationTargetException;
  4. import java.lang.reflect.Method;
  5. import java.lang.reflect.Modifier;
  6. import java.lang.reflect.TypeVariable;
  7.  
  8. public class Main {
  9. /**
  10. * 为了看清楚Java反射部分代码,所有异常我都最后抛出来给虚拟机处理!
  11. * @param args
  12. * @throws ClassNotFoundException
  13. * @throws InstantiationException
  14. * @throws IllegalAccessException
  15. * @throws InvocationTargetException
  16. * @throws IllegalArgumentException
  17. * @throws NoSuchFieldException
  18. * @throws SecurityException
  19. * @throws NoSuchMethodException
  20. */
  21. public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, SecurityException, NoSuchFieldException, NoSuchMethodException {
  22. // TODO Auto-generated method stub
  23.  
  24. //Demo1. 通过Java反射机制得到类的包名和类名
  25. Demo1();
  26. System.out.println("===============================================");
  27.  
  28. //Demo2. 验证所有的类都是Class类的实例对象
  29. Demo2();
  30. System.out.println("===============================================");
  31.  
  32. //Demo3. 通过Java反射机制,用Class 创建类对象[这也就是反射存在的意义所在],无参构造
  33. Demo3();
  34. System.out.println("===============================================");
  35.  
  36. //Demo4: 通过Java反射机制得到一个类的构造函数,并实现构造带参实例对象
  37. Demo4();
  38. System.out.println("===============================================");
  39.  
  40. //Demo5: 通过Java反射机制操作成员变量, set 和 get
  41. Demo5();
  42. System.out.println("===============================================");
  43.  
  44. //Demo6: 通过Java反射机制得到类的一些属性: 继承的接口,父类,函数信息,成员信息,类型等
  45. Demo6();
  46. System.out.println("===============================================");
  47.  
  48. //Demo7: 通过Java反射机制调用类中方法
  49. Demo7();
  50. System.out.println("===============================================");
  51.  
  52. //Demo8: 通过Java反射机制获得类加载器
  53. Demo8();
  54. System.out.println("===============================================");
  55.  
  56. }
  57.  
  58. /**
  59. * Demo1: 通过Java反射机制得到类的包名和类名
  60. */
  61. public static void Demo1()
  62. {
  63. Person person = new Person();
  64. System.out.println("Demo1: 包名: " + person.getClass().getPackage().getName() + ","
  65. + "完整类名: " + person.getClass().getName());
  66. }
  67.  
  68. /**
  69. * Demo2: 验证所有的类都是Class类的实例对象
  70. * @throws ClassNotFoundException
  71. */
  72. public static void Demo2() throws ClassNotFoundException
  73. {
  74. //定义两个类型都未知的Class , 设置初值为null, 看看如何给它们赋值成Person类
  75. Class<?> class1 = null;
  76. Class<?> class2 = null;
  77.  
  78. //写法1, 可能抛出 ClassNotFoundException [多用这个写法]
  79. class1 = Class.forName("cn.lee.demo.Person");
  80. System.out.println("Demo2:(写法1) 包名: " + class1.getPackage().getName() + ","
  81. + "完整类名: " + class1.getName());
  82.  
  83. //写法2
  84. class2 = Person.class;
  85. System.out.println("Demo2:(写法2) 包名: " + class2.getPackage().getName() + ","
  86. + "完整类名: " + class2.getName());
  87. }
  88.  
  89. /**
  90. * Demo3: 通过Java反射机制,用Class 创建类对象[这也就是反射存在的意义所在]
  91. * @throws ClassNotFoundException
  92. * @throws IllegalAccessException
  93. * @throws InstantiationException
  94. */
  95. public static void Demo3() throws ClassNotFoundException, InstantiationException, IllegalAccessException
  96. {
  97. Class<?> class1 = null;
  98. class1 = Class.forName("cn.lee.demo.Person");
  99. //由于这里不能带参数,所以你要实例化的这个类Person,一定要有无参构造函数哈~
  100. Person person = (Person) class1.newInstance();
  101. person.setAge(20);
  102. person.setName("LeeFeng");
  103. System.out.println("Demo3: " + person.getName() + " : " + person.getAge());
  104. }
  105.  
  106. /**
  107. * Demo4: 通过Java反射机制得到一个类的构造函数,并实现创建带参实例对象
  108. * @throws ClassNotFoundException
  109. * @throws InvocationTargetException
  110. * @throws IllegalAccessException
  111. * @throws InstantiationException
  112. * @throws IllegalArgumentException
  113. */
  114. public static void Demo4() throws ClassNotFoundException, IllegalArgumentException, InstantiationException, IllegalAccessException, InvocationTargetException
  115. {
  116. Class<?> class1 = null;
  117. Person person1 = null;
  118. Person person2 = null;
  119.  
  120. class1 = Class.forName("cn.lee.demo.Person");
  121. //得到一系列构造函数集合
  122. Constructor<?>[] constructors = class1.getConstructors();
  123.  
  124. person1 = (Person) constructors[0].newInstance();
  125. person1.setAge(30);
  126. person1.setName("leeFeng");
  127.  
  128. person2 = (Person) constructors[1].newInstance(20,"leeFeng");
  129.  
  130. System.out.println("Demo4: " + person1.getName() + " : " + person1.getAge()
  131. + " , " + person2.getName() + " : " + person2.getAge()
  132. );
  133.  
  134. }
  135.  
  136. /**
  137. * Demo5: 通过Java反射机制操作成员变量, set 和 get
  138. *
  139. * @throws IllegalAccessException
  140. * @throws IllegalArgumentException
  141. * @throws NoSuchFieldException
  142. * @throws SecurityException
  143. * @throws InstantiationException
  144. * @throws ClassNotFoundException
  145. */
  146. public static void Demo5() throws IllegalArgumentException, IllegalAccessException, SecurityException, NoSuchFieldException, InstantiationException, ClassNotFoundException
  147. {
  148. Class<?> class1 = null;
  149. class1 = Class.forName("cn.lee.demo.Person");
  150. Object obj = class1.newInstance();
  151.  
  152. Field personNameField = class1.getDeclaredField("name");
  153. personNameField.setAccessible(true);
  154. personNameField.set(obj, "胖虎先森");
  155.  
  156. System.out.println("Demo5: 修改属性之后得到属性变量的值:" + personNameField.get(obj));
  157.  
  158. }
  159.  
  160. /**
  161. * Demo6: 通过Java反射机制得到类的一些属性: 继承的接口,父类,函数信息,成员信息,类型等
  162. * @throws ClassNotFoundException
  163. */
  164. public static void Demo6() throws ClassNotFoundException
  165. {
  166. Class<?> class1 = null;
  167. class1 = Class.forName("cn.lee.demo.SuperMan");
  168.  
  169. //取得父类名称
  170. Class<?> superClass = class1.getSuperclass();
  171. System.out.println("Demo6: SuperMan类的父类名: " + superClass.getName());
  172.  
  173. System.out.println("===============================================");
  174.  
  175. Field[] fields = class1.getDeclaredFields();
  176. for (int i = 0; i < fields.length; i++) {
  177. System.out.println("类中的成员: " + fields[i]);
  178. }
  179. System.out.println("===============================================");
  180.  
  181. //取得类方法
  182. Method[] methods = class1.getDeclaredMethods();
  183. for (int i = 0; i < methods.length; i++) {
  184. System.out.println("Demo6,取得SuperMan类的方法:");
  185. System.out.println("函数名:" + methods[i].getName());
  186. System.out.println("函数返回类型:" + methods[i].getReturnType());
  187. System.out.println("函数访问修饰符:" + Modifier.toString(methods[i].getModifiers()));
  188. System.out.println("函数代码写法: " + methods[i]);
  189. }
  190.  
  191. System.out.println("===============================================");
  192.  
  193. //取得类实现的接口,因为接口类也属于Class,所以得到接口中的方法也是一样的方法得到哈
  194. Class<?> interfaces[] = class1.getInterfaces();
  195. for (int i = 0; i < interfaces.length; i++) {
  196. System.out.println("实现的接口类名: " + interfaces[i].getName() );
  197. }
  198.  
  199. }
  200.  
  201. /**
  202. * Demo7: 通过Java反射机制调用类方法
  203. * @throws ClassNotFoundException
  204. * @throws NoSuchMethodException
  205. * @throws SecurityException
  206. * @throws InvocationTargetException
  207. * @throws IllegalAccessException
  208. * @throws IllegalArgumentException
  209. * @throws InstantiationException
  210. */
  211. public static void Demo7() throws ClassNotFoundException, SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException, InstantiationException
  212. {
  213. Class<?> class1 = null;
  214. class1 = Class.forName("cn.lee.demo.SuperMan");
  215.  
  216. System.out.println("Demo7: \n调用无参方法fly():");
  217. Method method = class1.getMethod("fly");
  218. method.invoke(class1.newInstance());
  219.  
  220. System.out.println("调用有参方法walk(int m):");
  221. method = class1.getMethod("walk",int.class);
  222. method.invoke(class1.newInstance(),100);
  223. }
  224.  
  225. /**
  226. * Demo8: 通过Java反射机制得到类加载器信息
  227. *
  228. * 在java中有三种类类加载器。[这段资料网上截取]
  229.  
  230. 1)Bootstrap ClassLoader 此加载器采用c++编写,一般开发中很少见。
  231.  
  232. 2)Extension ClassLoader 用来进行扩展类的加载,一般对应的是jre\lib\ext目录中的类
  233.  
  234. 3)AppClassLoader 加载classpath指定的类,是最常用的加载器。同时也是java中默认的加载器。
  235. *
  236. * @throws ClassNotFoundException
  237. */
  238. public static void Demo8() throws ClassNotFoundException
  239. {
  240. Class<?> class1 = null;
  241. class1 = Class.forName("cn.lee.demo.SuperMan");
  242. String nameString = class1.getClassLoader().getClass().getName();
  243.  
  244. System.out.println("Demo8: 类加载器类名: " + nameString);
  245. }
  246.  
  247. }
  248. /**
  249. *
  250. * @author xiaoyaomeng
  251. *
  252. */
  253. class Person{
  254. private int age;
  255. private String name;
  256. public Person(){
  257.  
  258. }
  259. public Person(int age, String name){
  260. this.age = age;
  261. this.name = name;
  262. }
  263.  
  264. public int getAge() {
  265. return age;
  266. }
  267. public void setAge(int age) {
  268. this.age = age;
  269. }
  270. public String getName() {
  271. return name;
  272. }
  273. public void setName(String name) {
  274. this.name = name;
  275. }
  276. }
  277.  
  278. class SuperMan extends Person implements ActionInterface
  279. {
  280. private boolean BlueBriefs;
  281.  
  282. public void fly()
  283. {
  284. System.out.println("超人会飞耶~~");
  285. }
  286.  
  287. public boolean isBlueBriefs() {
  288. return BlueBriefs;
  289. }
  290. public void setBlueBriefs(boolean blueBriefs) {
  291. BlueBriefs = blueBriefs;
  292. }
  293.  
  294. @Override
  295. public void walk(int m) {
  296. // TODO Auto-generated method stub
  297. System.out.println("超人会走耶~~走了" + m + "米就走不动了!");
  298. }
  299. }
  300. interface ActionInterface{
  301. public void walk(int m);
  302. }

(转)个例子让你了解Java反射机制的更多相关文章

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

    本文来自:blog.csdn.net/ljphhj JAVA反射机制: 通俗地说,反射机制就是可以把一个类,类的成员(函数,属性),当成一个对象来操作,希望读者能理解,也就是说,类,类的成员,我们在运 ...

  2. 第28章 java反射机制

    java反射机制 1.类加载机制 1.1.jvm和类 运行Java程序:java 带有main方法的类名 之后java会启动jvm,并加载字节码(字节码就是一个类在内存空间的状态) 当调用java命令 ...

  3. Java反射机制

    Java反射机制 一:什么事反射机制 简单地说,就是程序运行时能够通过反射的到类的所有信息,只需要获得类名,方法名,属性名. 二:为什么要用反射:     静态编译:在编译时确定类型,绑定对象,即通过 ...

  4. java反射机制深入详解

    java反射机制深入详解  转自:http://www.cnblogs.com/hxsyl/archive/2013/03/23/2977593.html 一.概念 反射就是把Java的各种成分映射成 ...

  5. [转]java反射机制

    原文地址:http://www.cnblogs.com/jqyp/archive/2012/03/29/2423112.html 一.什么是反射机制         简单的来说,反射机制指的是程序在运 ...

  6. Java反射机制的学习

    Java反射机制是Java语言被视为准动态语言的关键性质.Java反射机制的核心就是允许在运行时通过Java Reflection APIs来取得已知名字的class类的相关信息,动态地生成此类,并调 ...

  7. JAVA反射机制—学习总结

    最近收到很多关于Java反射机制的问题留言,其实Java反射机制技术方面没有太多难点,或许是大家在学习过程中遗漏了细小知识点,导致一些问题无法彻底理解,现在我们简单的总结一下,加深印象.什么是反射机制 ...

  8. Java反射机制深入研究

    ava 反射是Java语言的一个很重要的特征,它使得Java具体了“动态性”.   在Java运行时环境中,对于任意一个类,能否知道这个类有哪些属性和方法?对于任意一个对象,能否调用它的任意一个方法? ...

  9. java 反射机制01

    // */ // ]]>   java反射机制01 Table of Contents 1 反射机制 2 反射成员 2.1 java.lang.Class 2.2 Constructor 2.3 ...

随机推荐

  1. Chapter 1 First Sight——25

    "They are… very nice-looking." I struggled with the conspicuous understatement. 他们都很好看,我与轻 ...

  2. java 正则

    ava - 正则表达式 - Pattern - Matcher 2013-08-21 14:35 3325人阅读 评论(0) 收藏 举报  分类: JavaSE(30)  版权声明:本文为博主原创文章 ...

  3. linux下base命令

    查看base那么命令的帮助: root@OpenWrt:/# basename --help BusyBox v1.22.1 (2015-09-15 16:38:30 CST) multi-call ...

  4. mvc Area相关技术

    ASP.NET MVC中,是依靠某些文件夹以及类的固定命名规则去组织model实体层,views视图层和控制层的.如果是大规模的应用程序,经常会由不同功能的模块组成,而每个功能模块都由MVC中的三层所 ...

  5. 面向方面编程(AOP)

    简介 如果你很熟悉面向方面编程(AOP),你就会知道给代码增加"切面"可以使代码更清晰并且具有可维护性.但是AOP通常都依赖于第三方类库或者硬编码的.net特性来工作.虽然这些实现 ...

  6. nefu 196 让气球飞吧

    description 国际大学生程序设计竞赛已经发展成为最具影响力的大学生计算机竞赛,ACM-ICPC以团队的形式代表各学校参赛,每队由3名队员组成,一个队每做出来一个题该队就会获得该题对应颜色的气 ...

  7. Oracle10 多行和并

    SELECT fspc, wmsys.wm_concat (jsrzmc) as jsr FROM dxjsrxx GROUP BY fspc select fspc, LISTAGG(jsrzmc, ...

  8. **ERROR: Ninja build tool not found.

    | if which ninja-build ;\| then \| ln -s `which ninja-build` bin/ninja ;\| else \| echo "***ERR ...

  9. php并发控制 , 乐观锁

    由于悲观锁在开始读取时即开始锁定,因此在并发访问较大的情况下性能会变差.对MySQL Inodb来说,通过指定明确主键方式查找数据会单行锁定,而查询范围操作或者非主键操作将会锁表. 接下来,我们看一下 ...

  10. 10款超酷实用的jQuery焦点图赏析及源码

    1.jquery整屏滚动插件Scrollify Scrollify是一个jQuery插件协助整屏滚动和顺利拍摄部分.完全可配置和优化. 在线演示 源码下载 2.jquery实现网易邮箱页面插件full ...