对于jdk1.5之后追加的一些技术,有相当多的一些部分是为做框架用的,在初识这些技术后觉得有必要对此做下总结。
枚举简而言之就是一种限制传指定对象的特殊类,其也相当于在该类的构造函数中定义了某些final,static的该类对象,枚举有自己的构造函数,字段,方法。当枚举中只传入一个对象时,也就相当于所谓的单实例模式。以简单的定义枚举People类为例。
enum people{ a(1) ,b(2);
int a;
private people(int a){ this.a=a; }
public int geta(){ return a; } }
这样可通过以下代码测试:
People po[]=People.values();
for(People po:pe){System.out.println (po.geta())};
输出结果为:1,2
另外对于枚举类的构造器必须为私有,这样才会体现枚举的意义所在。
反射可以说是整个javase的精髓所在,其很好的体现了面向对象的思想,一般用于加载类,解剖类的各个字节流,大多用在做框架时引用该类的字段,属性,方法。
以解析类的字段为例:Class c=Class.forName("cn.test.reflect.Person");//加载类
Constructor co =c.getConstructor(String.class);//得到构造器
Person p= (Person) co.newInstance("a") ;//构造实例
通过反射可以把类的字段,构造器,方法都以对象的形式表现出来,不禁感慨在java整个系统中,万物皆对象。
内省是个与反射较相似的技术,一般作用于javabean类的信息提取与修改。提到javabean不得不吐槽下字段与属性的区别,字段是指一个类定义的全局变量,而属性是指该类具体能通过getXX()方法得到的变量,所以任何一个类都有一个默认的属性:getclass().还是以Javabean类People为例,有age ,name等属性。
BeanInfo be=Introspector.getBeanInfo(People.class,Object.class); //得到给Javabean的BeanInfo信息
PropertyDescriptor[] po= be.getPropertyDescriptors();//得到属性描述器
for( PropertyDescriptor pr:po){
System.out.println(pr.getName())};//遍历该JavaBean的属性
也可对JavaBean的各个属性值进行读取与修改
PropertyDescriptor pr=new PropertyDescriptor("age", People.class);//得到该JavaBean age属性的描述器
Method me= pr.getWriteMethod();//得到修改值的方法
People p=new People();
me.invoke(p, 23);// 将上面对象的年龄改为23
当然,这只是这些技术的冰山一角,总之还是那句话 ,在java里,万物皆对象。