反射的引出和概念

来源:互联网 发布:贴图软件 编辑:程序博客网 时间:2024/06/05 03:28

问题:
对象有编译类型和运行类型:
Object obj=new Date();
编译类型:Object
运行类型(其实就是obj对象真实的类型):Date
需求:根据对象obj调用Date类中的一个方法,如toLocalString,如何来做?
obj.toLocalString();//代码在编译阶段去编译类型Object中检查是否有该方法,如没有,编译失败;——这条语句会在编译阶段报错
解决办法:
1.强制类型转换 Date d=(Date)obj; obj.toLocalString();–正确
强制类型转换的前提:必须知道对象的真实类型,否则无法强制转换
如果不知道obj的真实类型,那又如何去调用toLocalString方法?

引出:
对象:又可称为数据
类:用来描述对象,或者描述数据,又称为描述数据的数据
java中,万物皆对象——从概念上讲,那么类也是一个对象,既然类是一种对象,那么谁又来描述该对象呢?而我们又说描述对象的都是类
元数据(meta data):描述数据(类)的描述数据
java中,所有类都是由元数据描述(Class类)
反射:得到元数据的行为
Date d1 =new Date();
Date d2 =new Date();
Date d3 =new Date();

String s1=”A”;
String s2=”B”;
String s3=”C”;

ArrayList a1=new ArrayList();
ArrayList a2=new ArrayList();
ArrayList a3=new ArrayList();

Class类、类、对象的关系如图所示。

既然Class类是对一切类的共同功能和行为的抽象,一个类中一般包含有:包、类名、父类、字段、方法、构造器等,Class类中就应该有这些属性
那么Class中应该有类具备的成员:
getPackage()–表示类的包
getSuperClass()–表示类的父类
getMethods()–表示类的方法
getField()–表示类的字段

Class类没有字段和显示构造器,但是具有方法,这些方法可以得到其所描述的数据的属性。
通过反射可以得到一个对象或者类所对应的Class类的实例对象,通过该实例调用Class类中的getMethods(),可以得到所映射的类的所有方法…
使用反射的前提:要确定所要反射的是哪一个对象,或反射的是哪个类。

注意:Class与Object的区别:
Object是一切对象的父类,所有类都继承至Object,其针对的是对象
Class针对的是类
反射定义:就是得到某个类中所有成员的机制

通过反射机制就可解决上面提出的问题!
获得Class实例的方式之一:——-详细介绍见《Class类和Class实例》这一篇博客`
对象.getClass();———-每个对象都有该方法,因此该方法定义在Object类中—-返回的是该对象的真实类型,即运行时类型

0 0
原创粉丝点击