Chinaunix首页 | 论坛 | 博客
  • 博客访问: 278241
  • 博文数量: 58
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 600
  • 用 户 组: 普通用户
  • 注册时间: 2015-11-27 08:37
个人简介

从linux了解世界

文章分类
文章存档

2017年(5)

2016年(51)

2015年(2)

我的朋友

分类: Java

2016-07-30 14:56:54

当一个字节码文件加载到内存的时候,jvm会对该字节码文件进行解剖,然后创建一个对象的Class对象,把字节码文件的信息全部存储到该Class对象
在反射中,一个类的任何成员都有对应的类进行描述,成员变量(field),方法(method),构造方法(Constructor)

获取Class对象的方式:
通过Class类静态方法获取(推荐使用)
Class name1=Class.ForName(“类的全名”);//Class类的静态方法
通过类名获取
Class name2=某类.class;通过对象获取
Class name3=对象.GetClass();//三种方式获取的Class对象是同一个,name1==name2==name3

Class类方法:
Constructor[] Getconstructors()//获取类中所有公共构造方法的类集合,Constructor是构造方法的类
Constructor[] Getdeclaredconstructors()//获取类中所有构造方法的类集合
在反射中想获取private的东西都是带declared的方法
Constructor Getconstructor(想要获取的构造方法的参数类型的Class类对象,没有就是null)//获取单个公共构造方法
Constructor Getdeclaredconstructor()//可以获取私有构造方法
Method[] Getmethods()//获取公共方法的类集合,包括父类方法
Method[] Getdeclaredmethods()//获取全部方法的类集合,不包括父类方法
Method getmethod(方法名字符串,参数类型的class类对象)
Method getdeclaredmethod(方法名字符串,参数类型的class类对象)
Field[] getfields()//获取全部公共成员变量,用默认修饰符修饰的成员变量获取不到
Field[] getdeclaredfields()//获取全部成员变量
Field getfield(变量名字符串)//获取公共变量
Field getdeclaredfield(变量名字符串)//获取任何变量

Constructor类方法:
Newinstance(构造方法参数)//返回一个object对象,可以强转成真正的类型
Setaccessible(boolean)//设置构造方法的访问权限,当Constructor对象描述的是私有构造方法时,要先设置权限,true为可以访问

Method类方法:
Invoke(object,object…args)//第一个参数为方法的调用对象(如果是静态方法就可以写null),第二个是方法参数
Setaccessible(boolean)//设置方法访问权限,同上

Field类方法:
Set(object,object)//第一个参数成员变量所属对象,第二个参数是值
Setaccessible(boolean)
Class GetType();//返回该成员变量所属类型的Class对象。

内省
内省解决的问题是:把对象的属性封装到对象中,其实就是用反射机制做的api
属性描述器类:
Propertydescriptor p=new Propertydescriptor(“属性名”,属性所在类的Class);//获取一个属性的属性描述器对象,通过属性描述器获取该属性对应的set、get方法,设置或获取属性(如果类中没有set,get则内省无效)
Method getwritemethod();//返回属性的set方法的method对象,再通过method的invoke方法调用set方法
内省类:Introspector
BeanInfo b=Introspector.getBeanInfo(类的Class对象)//
通过beaninfo获取对象的所有属性描述器
Propertydescriptor[] b.get Propertydescriptors();
这两种方法都不方便,阿帕奇出了一个beanutils工具类,对反射封装的特别好,beanutils工具包依赖logging工具包,分别导入commons-logging和commons-beanutils包。Beanutils底层就是通过内省实现的,所以属性必须有set、get方法来获取设置属性值
Beanutils方法:
设置单个属性Setproperty(object bean,string name, object value)//第一个参数是要设置属性的类的对象,第二个参数是属性名,value可以接受任何类型然后beanutils自动转换成该属性的类型进行赋值(只有基本数据类型才可以),一般value都用字符串类型
copyproperty(object bean,string name, object value)和setproperty一样
copyproperties(object,object)把后者拷贝到前者,是对象的拷贝
populate(object,map)从map中的一个对象拷贝过来,map的key必须和对象的属性同名。
Beanutils优点:beanutils设置属性值的时候,如果属性是基本数据类型,beanutils会帮我们自动转换类型,如果属性是引用类型,那么必须要注册一个类型转换器,转换器是一个接口,有很多实现类,如果不符合要求要自己实现转换器接口,其中只有一个convert方法
String day=”2016-5-6”;
Convertutils.register(new Converter(){
Public Object convert(Class type,object value){//会把date.class和day传进去
转换操作最后return该type类型的对象
    }
},Date.class);
Person p=new person();
Beanutils.Setproperty(p,”birthday”,day)//birthday是p中的一个date类型的成员名
Beanutils.copyproperty(p,”birthday”,day)

阅读(2344) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~