粗略讲反射

来源:互联网 发布:广州网站搜索优化 编辑:程序博客网 时间:2024/06/06 14:26

反射

l  Java灵魂,默默工作,为web学习和EE框架学习打基础

1.  c

l  类加载:由类加载器完成,类的class文件读入内存后,就会创建一个java.lang.Class对象,一旦某个类被载入JVM中,同一个类就不会再次被载入,类模板信息,只有一个。                   new出来的StudentBean为实例对象,可有多个

l  String str = new String(“hello”);  产生三个对象:堆,常量池,类模板信息

l  连接:把类的二进制数据合并到JRE中

l  初始化:JVM负责对类进行初始化,也就是对静态属性进行初始化,在Java类中,对静态属性指定初始值的方式有两种

1.声明静态属性时指定初始值                         2.使用静态初始化块为静态属性指定初始值。

l  简单来说反射就是让你可以通过名称来得到对象(类,属性, 方法)的技术,一句话:运行时探究和使用编译时未知的类,真正的动态动态

2.  反射做什么

l  1.获得你想操作的类的java.lang.Class对象

n   调用实例对象继承于Object的getClass方法,不能得到基本数据类型的Class对象

u  可以得到所有类和数组的Class对象

u  没有编译时未知,运行时探究的动态效果

n   利语法类型名.class的方式获取到class对象,只能在JDK1.5以后使用

u  一个类只会有一个Class对象

u  所有类型;不管是基本数据类型还是引用数据类型,甚至是返回值类型void都可以得到class对象

u  包装类只能用类型名.TYPE//JDK1.5之前回去Class对象

u  没有编译时未知,运行时探究的动态效果

n   利用Class.forName(“字符串形式的类型名”)获取class对象

u  不支持数据类型。返回类型和数组获取相应Class对象

u  唯一有编译时未知,运行时探究的动态效果

l  2.调用诸如getDeclaredMethods3.使用reflection API来操作这些信息

n   Class对象.getPackage().getName();//探究包名,返回String类型

n   Class对象.getName();//探究类全名、类的限定名

n   Class对象.getSimpleName();//探究类的简单名,去除包的部分

n   Class对象.getModifiers();//得到修饰符—访问修饰符和可选修饰符的组合—返回int类型

Modifier。toString(Class对象.getModifiers.)//使用工具类把整形的修饰符表示装换为字符串的修饰符表示

n   Class对象.getSuperclass().getName();//得到父类

n   Class对象.getInterfaces();//得到接口,返回calss数组

l  探究属性

n   Field[] allpublicFields = class对象.getFields();//得到所有的公共属性(包括父类继承而来的公共属性)

n   Class对象.getDeclaredFields();//得到所有的声明属性不包括父类的声明

n   class对象.getField();//得到指定的公共属性(包括父类继承而来的公共属性)

n   Class对象.getDeclaredField();//得到指定的声明属性不包括父类的声明

n   属性  field                 构造constructor        方法 method              declared 指定的

l  探究构造方法

n   Con.getParamenterType();//得到形参列表,返回class数组

使用探究到的类的信息

n   根据探究到的Constructor对象,产生类的实例对象。好处可以调用类中任意构造方法,坏处实现过于麻烦

u  Dog = Class对象.getDeclaredConstructor(传参).newInstance;//用这个方法在反射中用来实例化对象,需要强转,为constructor的newInstance

u  theCon.setAccessible(true);//设置theCon的访问权限为可访---不到万不得已不准用

n   直接利用class对象产生实例对象

u  DogBean dog = null; dog = (DogBean)dogClass.newInstance();//只能调用公共无参构造,为class的newInstance

l  操作属性

n   Field thePublicField =dogClass.getField(“name”); thePublicField.set(dog1, “值”);//给Field对象赋值,第一个参是代表给那个狗对象的name属性赋值

n   ThePublicField.get(那个狗对象);

l  调用探究到的方法---invoke()

n   Method thePublicMethod =dogClass.getMethod(“方法名”, 传参.class); thePublicMethod.invoke(对象, 值);

n   当数组做形参时,尽量使用…的方式做形参(int… array)会自动罗列出来做形参

0 0
原创粉丝点击