反射机制<一>

问题1:
对象有编译类型和运行类型:
Object obj=new Date();
编译类型:object
运行类型(其实就是obj调用date对象真实的类型):Date
 
需求:根据对象obj调用Date中的一个方法,toLocaleString ,如何来做?

Obj.toLocalString()代码在编译阶段去编译类型object中检查否有该方法,若没有,编译失败

解决方法:强制转换obj为Date类型  前提:必须知道对象的真是类型是什么?
Date d=(Date) obj;
d.toLocaleString();

在不知对象的真是类型,那么如何调用方法?

问题2:
元数据:metadata 描述数据的描述数据 类:Class  对象:Object


反射:得到元数据的行为 reflection
Class是对一切类功能行为和状态的抽象

那么Class中应该有类具备的成员;
getPackage();表示类的包
getSuperClass();表示类的父类;
getMthods();表示类的方法
getField();表示类的属性

通过反射就可以得到一个类中的包,类名,父类,字段,方法,构造器
但是前提必须知道,必须知道反射那个类

Class类:用于描述一切类/接口 。枚举是一种类,注解是一种接口

Class实例:就是指jvm中一份字节码
Class类:用于描述一切类/接口。问题:Class实例到底表示的时哪一份字节码,为了明确区分出class实例表示的时谁的字节码文件。Class类提供泛型

例:Class<String > cl=String.class;

如何得到Class的实例:
1、 类名.class
2、 Class.forName(String className);根据一个类的全限定名来构建Class对象
3、 每一个对象都有getClass()方法;obj.getClass();返回对象的真实类型
一个类在虚拟机中有且只有一份字节码文件
对于对象来说,可以用以上方法获取Class实例
但是基本数据类型,就没有类的权限定名,也没有getClass方法

如何使用Class类来表示基本数据类型的Class实例
基本数据类型:byte、short、int、long、float、double、char、boolean
Void
解决方法:
Int.class  int.class==Integer.class  //false 说明是两个不同的字节码文件
但是八大基本数据类型的包装类中都有一个常量:TYPE
TYPE表示的是该包装类对应的基本数据类型的class实例 int.class=Integer.TYPE;
Long.class ········

数组:所有具有相同元素的数据类和维数的数组才共享同一份字节码
注意:和数组中的元素没有一点关系

 

posted on 2016-05-10 21:20  Jleeci  阅读(96)  评论(0编辑  收藏  举报

导航