编程语言分类(以程序运行时结构及变量类型的可变性作为标准):
--|1.静态语言
--|2.动态语言:程序运行时,允许改变程序的结构及变量类型的语言;
~由此,Java、C++、C#是非动态语言,而Perl、Python、Ruby是动态语言
·Java中按照加载时机将类的加载类型划分为编译时检查类型、运行时加载类型
1.编译时检查类型的类(运行时已识别类型:RTTI--Run Time Type Identificated):编译时识别,该类型的类在编译时由编译器检查确认,在运行时加载
2.运行时加载类型(反射:主要用于构造工具):从其他地方得到一个未知类的对象,在程序运行时动态的将该未知类对象所在类文件加载到Java Virtual Machine中
---- 反射(Reflective): 能够分析类能力的程序
···反射库(Reflection Library)-丰富且精心设计的工具集,方便编写能够动态操纵Java代码的程序。这项功能被大量应用与JavaBeans中,JavaBeans为Java组件的的体系结构,在设计或运行中添加新类时,可以快速应用开发工具动态查询新添加类的能力(具体体现为获得新类的实例域及方法);
·反射机制的作用:
1.程序运行时动态分析类的能力
2.程序运行时动态查看对象,例如:编写一个toString方法供所有类使用
3.实现通用的数组操作代码
4.利用Method对象(对象类似于C++中的函数指针)
反射中的类Class、Constructor、Method
·Class类(泛型类--例如:Employee.class的类型是Class<Employee>):保存对象在程序运行时的类型信息(程序运行期间,Java运行系统始终为所有的对象维护一个被称为运行时的类型标识。该信息跟踪着每个对象所属的类。虚拟机利用运行时类型信息选择相应的方法执行),一个Class对象表示一个特定类的属性
Class类中的方法:
1.public String getName(){} -- 返回类的名字
2.public static Class forName(String className){} -- 返回对应className的类的Class对象(className:类或接口的全名,即包名.类名),需处理异常:ClassNotFoundException
3.T表示任意Java类型:则T.class将代表T对应的Class类对象
4.任意对象都有的方法:public Class getClass(){} -- 返回调用该方法的对象的所属类的Class类对象
注:2、3、4为获取Class类对象的方法(以下仅针对获取Class类对象这一过程)
>其中编号为2的方法仅需要类的名字,而不需要导入包,更加具有普遍意义(反射 -- 运行时检查,处理的运行时异常为ClassNotFoundException);
>编号为3的方法需要类的名字,且需要导入相应的包(编译时检查);
>编号4的方法需要类对象且需要导入相应的包(编译时检查);
5.public Method getMethod(String methodName, Class...parametersType){} -- 返回特定方法的Method对象
>第一个参数为方法名字,之后的参数为要获取方法的参数所在类的Class对象(以下同此格式可以此方式解释)
6.public Method[ ] getMethods(){} -- 返回Class对象指向的类中以public作为访问权限修饰符的方法
>以下同此格式可以此方式解释(实在拗口,书写不便,见谅!)
7.public Method[ ] getDeclaredMethods(){} -- 返回Class对象指向的类中的所有方法(包括protected、private修饰的方法)的Method对象的数组;
>以下同此格式可以此方式解释(实在拗口,书写不便,见谅!)
注:5、6、7为Class类中获取Class对象指向的类中的方法的方法
8.public Constructor getConstructor(Class...parameterTypes){} -- 返回Class对象中特定构造器的Constructor对象
9.public Constructor[ ] getConstructors(){} -- 返回包含Class对象中公共构造器对象的Constructor数组
10.public Constructor[ ] getDeclaredConstructors(){} -- 返回包含Class对象中所有构造器对象的Constructor数组
注:8、9、10为Class类中获取Class对象中的构造器的方法
11.public Field getField(String name){} -- 返回Class对象中的特定实例域的Field对象
12.public Field[ ] getFields(){} -- 返回包含Class对象中公共实例域对象的Field数组
13.public Field[ ] getDeclaredFields(){} -- 返回包含Class对象中所有实例域对象的Field数组
注:11、12、13为Class类中获取Class对象中的实例域的方法(因封装原理,一般getDeclaredFields(){}是无意义的)
14.public void setAccessible(boolean flag){} -- 设置访问Class对象所指向的类的私有属性权限
Method类:描述方法的类
Method类对象指向具体的方法,类似于C、C++中的函数指针;
Method类中的方法:
public void invoke(String methodName, Object...parameters){} -- 调用Method类对象所指的方法(在运行时动态调用需要的方法)
Constructor类:描述构造器的类
Constructor类对象指向具体的构造器,本质是函数,也类似于C、C++中的函数指针;
Constructor类中的方法:
public Object newInstance(Object...parameters){} -- 调用Constructor类对象所指的构造器
Field类:描述实例域的类
关于实例域(Field):
-- 封装:从形式上看封装不过是将数据和行为组合在一个包内,并对对象的使用者隐藏了行为的实现方式。对象中的数据称为实例域(instance field),这些值的集合就是这个对象的当前状态(state)。向对象发送一条消息,它的状态就有可能发生改变。
对象的主要特性:
1.对象的行为(behavior) -- 可以对对象施加哪些操作,或可以对对象施加哪些方法
2.对象的状态(state) -- 当施加方法时,对象如何响应
3.对象表示(identity) -- 如何辨别具有相同行为与状态的不同对象
大致上的含义是改变数据的方式、改变后的数据代表的意义、标示相同数据的不同含义
>由此,对象即一组数据,而数据能够通过逻辑运算实现人为赋予的抽象意义!!
!·待补充 -- 动态代理