为什么要用反射?

举个栗子:

package com.imooc.reflect;

public class Work {

    // 定义一个word方法
    public void word() {
        System.out.println("厉害了word哥");
    }
}
package com.imooc.reflect;

public class Word {

    public static void main(String[] args) {
        Work work = new Work();
        work.word(); // 厉害了word哥

        work.excel(); // 报错,因为work类中没有这个方法
    }
}

我们希望既然定义了word方法就能使用该方法,而不受是否有excel()方法的影响。

反射的作用就是避开编译期不通过的影响,运行期需要调用word()方法就能调用,不用管excel()方法是否存在。

编译时刻加载类是静态加载类、运行时刻加载类是动态加载类。

动态加载类的三种方式:

 1 package com.imooc.reflect;
 2
 3 public class ClassDemo1 {
 4
 5     public static void main(String[] args) {
 6         //Foo的实例对象如何表示
 7         Foo foo1 = new Foo();
 8         //Foo这个类 也是一个实例对象,Class类的实例对象,如何表示呢
 9         //任何一个类都是Class的实例对象,这个实例对象有三种表示方式
10
11         //第一种表示方式--->实际在告诉我们任何一个类都有一个隐含的静态成员变量class
12         Class c1 = Foo.class;
13
14         //第二中表达方式  已经知道该类的对象通过getClass方法
15         Class c2 = foo1.getClass();
16
17         /*
18          * c1 ,c2 表示了Foo类的类类型(class type)
19          * 万事万物皆对象,
20          * 类也是对象,是Class类的实例对象
21          * 这个对象我们称为该类的类类型
22          *
23          */
24
25         //不管c1  or c2都代表了Foo类的类类型,一个类只可能是Class类的一个实例对象
26         System.out.println(c1 == c2);
27
28         //第三种表达方式
29         Class c3 = null;
30         try {
31             c3 = Class.forName("com.imooc.reflect.Foo");
32         } catch (ClassNotFoundException e) {
33             // TODO Auto-generated catch block
34             e.printStackTrace();
35         }
36         System.out.println(c3 == c2);
37
38         //我们完全可以通过类的类类型创建该类的对象实例---->通过c1 or c2 or c3创建Foo的实例对象
39         Foo foo;
40         try {
41             foo = (Foo)c1.newInstance();//需要有无参数的构造方法
42             foo.print();
43         } catch (InstantiationException e) {
44             // TODO Auto-generated catch block
45             e.printStackTrace();
46         } catch (IllegalAccessException e) {
47             // TODO Auto-generated catch block
48             e.printStackTrace();
49         }
50     }
51 }
52
53 class Foo{
54     void print() {
55         System.out.println("hahahahahaha");
56     }
57 }

以上是自己在慕课网学习java反射的一点点理解,肯定不精准,只是为了快速理解反射。毕竟越简单越方便入门。等自己达到一定水平再追求精确吧。希望读到此篇的同学,不要太把本文太当真,理解就好。

最新文章

  1. js 正则表达式 ( 1 )
  2. Spring注入方式及注解配置
  3. Raspberry pi 添加vnc远程桌面控制
  4. 【算法与数据结构】二叉搜索树的Java实现
  5. ubuntu 14.04 下找不到命令,路径出错
  6. C++基础知识面试精选100题系列(1-10题)[C++ basics]
  7. Git工作流指南:集中式工作流
  8. 第1章 游戏之乐——让CPU占用率曲线听你指挥
  9. 隐藏gvim中的工具栏和菜单栏
  10. MongoDB备份数据库&导入数据库
  11. Asp.net Identity 系列之 怎样修改Microsoft.AspNet.Identity.EntityFramework.IdentityUser 的 Id 字段的数据类型
  12. (转)Windows管道(Pipe)重定向stdout,stderr,stdin
  13. Solr DateRangeField
  14. Python常见面试题
  15. spring aop 切面编程
  16. 【洛谷p1162】填涂颜色
  17. 【C/C++】数组 & 指针
  18. CSS3-flex弹性布局之flex属性
  19. H5自适应屏幕分辨率大小
  20. linux sqlplus查询数据中文乱码解决方法记录

热门文章

  1. 4.bool组合查询
  2. Mysql数据库操作(二)
  3. ZooKeeper学习总结(2)——ZooKeeper开源Java客户端ZkClient使用
  4. Spring Cloud 之 Cookie 丢失 与 Host 传递
  5. posix线程库1
  6. java 调用 库文件错误查找方法
  7. Java三行代码搞定MD5加密
  8. 让devstack中的vm訪问外网
  9. URAL 1601. AntiCAPS (strings)
  10. CMDBuild安装