java_反射_j技术总结

来源:互联网 发布:java 参数 ... 传参 编辑:程序博客网 时间:2024/06/16 00:26
时间:2017-7-30


初识反射(reflect)


就是可以在代码运行期间获取(加载一个类) 可以使代码更加的灵活
反射在java中就相当于 女娃或上帝 可以根据自己的意愿(完全限定名)直接创造一个新的类


Class 好比蓝图  知道了蓝图就可以获取各个部位的具体信息


三个动态性质
1、运行时生成对象实例
2、运行期间调用方法
3、运行时更改属性
可以实现的功能
1、判断所属的类
2、构造任意一个类
3、判断所具有的方法和属性
4、调用任意一个方法
---------------------------------------------------------
语法:
class: 反射的核心类    获取和设置值
file: 属性获取和设置值
methed: 方法 获取和设置值
constructor: 构造方法

每个类加载后,系统都会该类生成一个对应的Class对象,通过Class对象就可以访问到【java虚拟机中的这个类】这一点至关重要
获取class对象的三种方法:
1、调用对象的方法 getClass()
Person person = new Person();
Class cla = person.getClass();
调用某个类的class属性类获取对应class对象
Class cla = person.class ;
3、静态的加载
Class cla= Class.ForName("完全限定名");


------------------------------------------------------------
Class的方法
构造方法
1、 getConstructor(Class[] params)
作用:返回表示此对象的类的指定的public构造方法
例子:Constructor c= cla.getConstructor(String.class,String.class,Integer.class)
2、 getConstructor()
作用:获取class对象的所有构造方法
例子:Constructor [] arrc = cla.getConstructor()
3、 getDeclareConstructor(Class[] params)
作用:获取此class对象锁表示的类的指定构造方法 与 访问级别无关  返回一个


4、 getDeclareConstructors()
作用:返回所有的方法 


调用成员方法
1、 getMethed(String name,Class[] params)
返回 public方法
2、 getMetheds()
返回所有的public方法
3、 getDeclareMethed(Class [] params)
返回指定的方法 与 访问级别没有关系
4、 getDeclareMetheds()
返回所有的方法与 访问级别没有关系


调用成员属性


1、 getField(String name)
获得指定的属性 public修饰的属性
2、 getFields()
获取所有的属性
3、 getDeclareField(string name)

4、 getDeclareFields()


调用内部类
1、 getDeclareClasses()
返回此class对象所对应的类里的包含的全部内部类
Class 吃classes = cla.getDeclareClasses();


调用外部类
1、 getDeclareClass()
返回此对象所在外部类
Class oclass = cla.getDeclareClass()



调用其他方法
1、 getInterface()
返回此对象对应的类的锁实现的全部接口
2、 getName()
返回此对象对象的类的名称
3、 getSupperclass
返回该对象所表示的类的超类对应的Class对象




---------------------------------------------------------------
使用反射创建对象
有两种方法
1、 使用newInstance() 方法来创建一个对象
Class dateCla = Date.class
Date d =  (Date)dateCla.newInstance()


2、 使用Constructor()方法创建对象

Constructor ct = Cla.getConstructor()
xx = ct.newInStance()


调用方法
不创建实例 直接通过class方法 调用方法(传入已经存在的对象实例就可以)
Person p = new Person();
method1 = cla.getMenthod("name",args)
method1.invoke(p,null);
调用属性
Class cla person.class;
Person p = new Person();

Field nameField = cla.getDeclareField("name");
name.setAccessible(true) //取消权限的检查
nameField.set(p,"tom")


----------------------------------------------------------------------------
以上的信息都是 反射的API中的信息  本质实现 原理解释如下
有了以上的信息可以 在运行时new一个对象  但是发现并没有多大的卵用!!!!


想要了解反射的本质,知道上文 顶多可以说你已经认真的阅读过API 


TYPE java所有类型代表【接口】

子接口GenericArrayType、ParameterizedType、TypeVaeiable、WildcardType
数组 、参数、变量、通配符表达式


其中ParameterizedType 代表泛型
Ttpe getRawType()接口和类
TYpe getOwnerType()名称
Type getActualTypeArguments()参数


例子: 获得第一个参数类型Class
public BaseDaoImpl() {
this.entityClass=null;
//利用反射的方式取得T的类型
Class c =getClass();
Type t=c.getGenericSuperclass();
if(t instanceof ParameterizedType){
Type[] p=((ParameterizedType)t).getActualTypeArguments();
this.entityClass=(Class<T>)p[0];
}
}
__
实现类 Class 【表示正在运行的类和接口 枚举是类,注释是接口】 每个数组都被映射为一个Class对象的一个类 所有相同类型的元素和位数的数


组共享该Class对象,基本的java类型的(boolean、byte、char、int、long'、float、double)和关键字void也表示为一个Class对象
Class没有公共的构造方法,Class对象是在加载类时有java虚拟机以及通过调用类加载器的defineClass方法自动构造的