java反射_01
为什么要用反射?
举个栗子:
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反射的一点点理解,肯定不精准,只是为了快速理解反射。毕竟越简单越方便入门。等自己达到一定水平再追求精确吧。希望读到此篇的同学,不要太把本文太当真,理解就好。
java反射_01的更多相关文章
- 第28章 java反射机制
java反射机制 1.类加载机制 1.1.jvm和类 运行Java程序:java 带有main方法的类名 之后java会启动jvm,并加载字节码(字节码就是一个类在内存空间的状态) 当调用java命令 ...
- Java反射机制
Java反射机制 一:什么事反射机制 简单地说,就是程序运行时能够通过反射的到类的所有信息,只需要获得类名,方法名,属性名. 二:为什么要用反射: 静态编译:在编译时确定类型,绑定对象,即通过 ...
- java反射(基础了解)
package cn.itcast_01; /** *Person类 */ public class Person { /** 姓名 */ private String name; ...
- java基础知识(十一)java反射机制(上)
java.lang.Class类详解 java Class类详解 一.class类 Class类是java语言定义的特定类的实现,在java中每个类都有一个相应的Class对象,以便java程序运行时 ...
- java基础知识(十一)java反射机制(下)
1.什么是反射机制? java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象都能够调用他的属性和方法,这种动态获取属性和方法的功能称为java的反射机制. ...
- java反射学习之二万能EXCEL导出
一.EXCEL导出的实现过程 假设有一个对象的集合,现在需要将此集合内的所有对象导出到EXCEL中,对象有N个属性:那么我们实现的方式是这样的: 循环这个集合,在循环集合中某个对象的所有属性,将这个对 ...
- java反射学习之一反射机制概述
一.反射机制背景概述 1.反射(reflection)是java被视为动态语言的一个关键性质 2.反射机制指的是程序在运行时能获取任何类的内部所有信息 二.反射机制实现功能概述 1.只要给定类的全名, ...
- java反射 之 反射基础
一.反射 反射:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为 ...
- java反射 cglib asm相关资料
有篇文章对java反射的调用的效率做了测试,写的比较好.猛击下面地址 http://www.blogjava.net/stone2083/archive/2010/09/15/332065.html ...
随机推荐
- [备忘]git常用命令
网站有点儿久没有维护(因为去做其他事情了呗),现在空下来,回来改了网站的一些东西,却忘记了git的一些常用的命令,于是便写下这篇文,方便查阅,免得每次都去看手册(毕竟我懒啊!!) 检查当前文件状态:g ...
- 《AlwaysRun!》第八次团队作业:Alpha冲刺 第二天
项目 内容 这个作业属于哪个课程 老师链接 这个作业的要求在哪里 实验十二 团队作业8:软件测试与Alpha冲刺 团队名称 Always Run! 作业学习目标 (1)掌握软件测试基础技术. ( ...
- Redis Expire TTL命令
Redis can be told that a key should only exist for a certain length of time. This is accomplished wi ...
- [JLOI2015]战争调度
[JLOI2015]战争调度 题目 解题报告 考试打了个枚举的暴力,骗了20= = $qsy$大佬的$DP$: 其实就是枚举= =,只不过枚举的比较强= = #include<iostream& ...
- python编码小记
Python编码小记 标签(空格分隔): 编程 python 1.list类型remove()操作 列表对象执行remove()函数后,会自动退出循环,所以如果想利用一个单独的for循环删除列表中多个 ...
- ggplot画基本图形类型
df<-data.frame( x=c(3,1,5), y=c(2,4,6), label=c("a","b","c"))p<- ...
- hdu_1013_Digital Roots_201310121652
Digital Roots Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tot ...
- 正则表达式,字符串中需要两个反斜杠“\\d”
这个正则表达式为什么会有两个反斜杠? "^.*?\\.(jpg|png|bmp|gif)$"上面这个正则表达式为什么有两个反斜杠呢?反斜杠点\.就能表示点.了,为什么还要在\.前面 ...
- ORACLE11G设置IP訪问限制
出于数据安全考虑,对oracle数据库的IP做一些限制,仅仅有固定的IP才干訪问. 改动$JAVA_HOME/NETWORK/ADMIN/sqlnet.ora文件 添加下面内容(红色表示凝视): #开 ...
- Android 线程 Looper.prepare()、Looper.loop() 使用
优化项目过程中发现了一个非常Low的问题,整理一下.备忘: 说问题之前先看下HandlerThread的定义 一个封装了looper的线程: Looper用于封装了android线程中的消息循环. ...