黑马程序员------第16天(反射)
来源:互联网 发布:java工厂模式的好处 编辑:程序博客网 时间:2024/05/21 08:16
反射的深入讲解
1. 透彻分析反射的基础_Class类
a) Class类:
java程序中各个java类属于同一类事物。描述这类事物的java类名就是Class。
b) 函数:
String getName( )
Package getPackage()获得这个类所属的包
method[] getMethods()获得这个类中所有方法列表
Class<T> getInterfaces()得到自己实现的多个接口
c) Class 类没有构造方法
例:Person p1=new Person()
Person p2=new Person()
Class cls1=Date.class//字节码1;
Class cls2=Person.class//字节码2
p1.getClass();//找到我的字节码妈妈
Class.forName(“java.lang.String”);
作用:返回字节码.
返回的方式有两种 ①这份字节码已经加载到内存中,直接返回
②java虚拟机中还没有这份字节码,则用类加载器去加载
d) 计算机要使用这些二进制字节码时,要把这些文件加载到内存中,然后才创建一个一个对象。
Date Math
如果内存中有三份字节码,那么内存里就有3个Class类的实例对象
e) 如何得到各个字节码对应的实例对象(三种方式):
1. 类名.class 例如:System.class
2. 对象.getClass() 例如:newDate().getClass()
3. Class.forName(“类名”) 例如:Class.forName(“java.util.Date”);
f) 基本的 Java 类型(boolean、byte、char、short、int、long、float 和 double)和关键字 void 也表示为 Class 对象。
g) isPrimitive() 判断是否是基本类型
String是一个类,但不是基本数据类型
数组不是基本数据类型
总之只要是在源程序中出现的类型,都有各自的Class实例对象,例如int[]
void
2. 理解反射的概念
反射就是把java类中的各种成分映射成相应的java类。例如,一个java类中用一个Class类的对象来表示,一个类中的组成部分:成员变量,方法,构造方法,包,等等信息也用一个个的java的类来表示。就像汽车是一个类,汽车中的发动机,变速箱等等也是一个个的类。表示java类的Class类显然要提供一系列的方法,来获得其中的变量,方法,构造方法,修饰符,包等信息,这些信息就是用相应类的实例对象来
表示他们是Filed,Method,Contructor,Package等等
3. 构造方法的反射应用
a) Constructor类代表某个类中一个构造方法
方法:
① getDeclaringClass()
② int getModifiers()
③ ObjectnewInstance() à强制转换
b) 得到某个类中所有构造方法:
例子:
Constructor[]constructors=
Class.forName(“java.lang.String”).getConstructors();
c) 得到某一个构造方法:
例子:Constructor constructor=
Class.forName(“java.lang.String”).getConstructor(StringBuffer.class)
()中写明对应参数列表的Class列表
d) 反射会导致程序性能严重下降(19,21:35)
4. 成员变量的反射
a) Fileld类代表某一个类中的成员变量
b)
publicclass ReflectPoint {
private int x;//在反射里
public int y;
public String str1="ball";
public Stringstr2="basketBall";
public String str3="itcast";
public ReflectPoint(int x, int y) {
super();
this.x = x;
this.y = y;
}
public String toString()
{
returnstr1+":"+str2+":"+str3;
}
}
privatestatic void changeStringValue(Object obj)throws Exception
{
Field[]fields=obj.getClass().getFields();//获取字节码中的所有变量
for(Field field:fields)
{
if(field.getType()==String.class)//字节码拿等号比,因为是同一份字节码
{
StringoldValue=(String)field.get(obj);
StringnewValue=oldValue.replace('b','a');
field.set(obj,newValue);
}
}
}
changeStringValue(pt1);
System.out.println(pt1);
5. 成员变量反射的综合案例
6. 成员方法的反射
a) Method类代表某个类中的一个成员方法
b) 得到类中的某一个方法:
例子:
MethodcharAt=
Class.forName(“java,lang.String”).getMethod(“charAt”,intclass)
c) 调用方法:
1. 通常方式:System.out.println(str,charAt(1));
2. 反射方式:System.out.println(charAt,invoke(str,1));
d) 如果传递给Method对象的invoke()方法的第一个参数为null,这样意味这什么呢?说明该method对象对应是一个静态方法。
e) JDK1.5和JDK1.5中invoke的区别
JDK1.5:public Objectinvoke(Object obj,Object…args)
JDK1.4:public Objectinvoke(Obejct obj,Object[] args)
7. 对接收数组参数的成员方法(主函数)进行反射
a) 为什么要用反射的方式调用主函数:
b) 目标:写一个程序,这个程序能够根据用户提供的类名,去执行类中的main方法
c) 问题:启动java程序的main方法的参数是一个字符串数组,即public staticvoid main(String[] args),通过反射方式来调用这个main方法时,如何为ivoke()传递参数呢?
按JDK1.5的语法,整个数组是一个参数,而按照JDk1.4的语法,数组中每一个元素对应一个参数,当把一个字符串数组作为参数传递给invoke方法时,javac会按照哪一种语法?向下兼容原理:
d) 解决办法:
8. 数组与Object的关系及其反射类型
9. 数组的反射应用
10. ArrayList_HashSet的比较及Hashcode分析
java中有没有内存泄露吗???
就是说对象不需要再用,但是还在占用内存空间。
hashCode();
11. 框架的概念及用反射技术开发框架的原理
a) 反射的作用:框架
12. 用类加载器的方式管理资源和配置文件
a) 配置文件用类加载器加载,只读,没有outStream保存对应上面的程序
b) 配置文件一定要放在类的目录里面,
c) 直接卖可乐得了
13. 由内省引出JavaBean的讲解
a) 内省的理解:内省:IntroSpector:检查视察,对内部进行检查,主要用于javaBean进行操作,
b) JavaBean是一个特殊的java类
1. int getAge()返回对象的
2. void setAge()
14. 对JavaBean的简单内省操作
15. 对JavaBean的复杂内省操作
---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------
- 黑马程序员------第16天(反射)
- [黑马程序员](第31天)高新技术之反射---易错点
- [黑马程序员](第31天)高新技术之反射
- 黑马程序员——高新技术---反射--第25天--(最后一天)
- 黑马程序员-高新技术(反射)
- 黑马程序员-------(高新技术)反射
- 黑马程序员-高新技术(反射)
- 黑马程序员-反射(高新技术)
- 黑马程序员--反射(重要)
- 黑马程序员-----反射(上)
- 黑马程序员-----反射(下)
- 【黑马程序员】反射(十一)
- 黑马程序员--反射(Java)
- 黑马程序员-(高新技术)反射
- 黑马程序员--反射(上)
- 黑马程序员--反射(下)
- 黑马程序员 + 第16天 Map集合
- 黑马程序员--【强哥笔记】系列之Java高新技术笔记之反射(第3天)
- 列车车次查询-余票查询-Api接口
- 数据库脚本规范
- SG函数
- 乌鲁木齐火车南站暴恐袭击案告破
- 指针函数与函数指针的区别
- 黑马程序员------第16天(反射)
- 模块管理常规功能自定义系统的设计与实现(19--模块附件的设计[2])
- 各种素材集中
- hadoop基础:Java中的Hash值介绍
- (转载)函数指针及函数指针数组的妙用
- UML九种图之部署图和构件图
- 函数指针数组的定义
- Hive-0.12.0配置安装
- 言语的暴力胜过一切枪支弹药