反射类加载和垃圾回收

来源:互联网 发布:勒索病毒源码 编辑:程序博客网 时间:2024/06/06 04:20
反射类加载和垃圾回收

反射

1底层运行的根本
目的
2反射是什么
3反射是做什么的
4反射与动态多态的关系
String str=new String ("xx");
产生了 两个字符串对象 new出来的 和xx 变量字符串
产生了 三个对象 类某模板对象string 和 两个字符串对象!
类的加载机制
连接
加载 →验证→准备→解析 →初始化

类的加载机制: 由类加载器完成,类的class文件读入内存后,就会创建一个java.lang.Class对象,一旦那某个类被载入到jvm中,同一个类就不会被再次加载
连接:把类的二进制数据合并到 JRE中
初始化:jvm负责对类进行初始话,也就是对静态属性进行初始话,在java中,对静态属性制定初始值的方式有两种 1 声明静态属性时指定初始值;2使用静态初始化快大队今天太属性指定初始值



反射:java的反射技术是java程序的特征之一, 它允许运行中的java程序对自身进行检查,并能直接操作程序的内部属性 使用反射可以获得java类中的各个成员的名称并显示出来,简单的说,反射就是让你可以通过名称来得到对象(类,属性,方法)的技术

一句话 运行时探究和使用编译时未知的类!!
xx类的类模板对象只有一个 而xx类的实例对象却有很多个!

class类 :专门装载类的属性 在编译好一个类时 它会以很多个对象的形式将这个类存储,只有注释才不会被储存!也被叫做类模板对象!

反射的三个步骤
1获得想操作的java.lang.class对象
三种方式获取对象
1-A 调用示例对象的继承于Object的getclass方法
特点 1-A-1 可以得到所有类和数组的class对象
1-A-2 没有编译时未知,运行时探究的动态效果

1-B 利用语法 类型名点class的方式获取到class对象
证明 一个类只会有一个class对象
class cc=int.class;
只有这种方法可以得到基本数据类型的 基本数据类型的class对象 只能在jdk1.5之后使用!
jdk1.5之前 获得基本数据类型的class对象对象的方法
class cc=integer.TYPE;
特例void 也有class对象 也能通过 void.class的方法 获得classd对象

特点 1--B-1 所有的类型 (不管是基本数据类型还是引用数据类型,甚至是无返回类型void)都可以得到相应的class对象
1-B-2 比第 1 -A 探究的更多 但是还是没有编译时未知,运行时探究的动态效果!

1-C 利用class.forName(“字符串形式的类型名”)获取class对象
class cc= class.forname("com.love.bean.xxbean");
特点 1-C-1 不支持基本数据类型,返回类型和数组获取相应的class对象
1-C-2 拥有编译时未知,运行时探究的动态效果!

2-0探究类的信息
2-A 探究类的基本声明部分
String packagename =xxclass.getpackage().getName(); 探究包名
String classname=xxcclass.getName() ;探究类全名,类的限定名
String classsimplename =xxclass.getSimpleName();探究类的简单名
int aa=xxclass。getModifiers() 得到修饰符的Int值----访问修饰符和可选修饰符的组合
string classMoster=Modifier.tostring(aa);使用工具类把整形的修饰符表示转换为在字符串的修饰符表示
String superclassname=xxclass.getSuperclass().getName() ;得到父类
class[] allinterlasses=xxclass.getInterfacees(); 得到接口
2-B 探究属性 --Field
2-b-1探究所有属性
Filed [ ] allPublicFields = xxclass.getFields() 得到所有的公共属性包括父类继承而来的公共属性
Filed [ ] allFields=xxclass.getDeclaredFields(); 得到所有对的申明的属性 不包括来自父类的!
2-b-2探究指定属性
Filed filed =xx.class.getField("属性名"); 得到指定的公共的指定属性,包括父类继承过来的!
Filed thefiled=xx.class.getDeclaredField("属性名")//得到指定的申明属性(不包括来自父类的);
12种探究方法
属性 Filed 构造 Constructor 方法 methord
所有的公共的 所有申明的 指定公共的 指定申明的
2-C探究构造 Constructor
Constructor [ ] allpubliccons=xxclass.getConstructors() 得到所有的公共的构造方法
Constructor [ ] allpublicconss=xxclass.getDeclaredConstructors(数据类型.(点)class 那个构造方法里面有几个就写几个,并且按照顺序写) //得到指定申明的构造
2-D探究方法 ---method
Method [ ] ss=xx.class.getMethods();
Method [ ] sss=xx.class.getDeclaredMethods()

3-0 使用探究到类的信息
3-1使用反射创建对象 ----java中第三种创建对象的方法
3-1-1根据探究道德constructor对象 ,产生类的实例对象
好处:可以调用类任意构造方法
坏处;实现过于麻烦
xxBean xx=null
constructor thecon=dogClass.getDeclaredConstructor(构造器的形参列表);
thecon.setAccessible(true);//设置thecon的访问权限为可访----不到万不得已不准用
xx=(xxBean)thecon.newInstance(实参);
3-1-2直接利用class对象产生实例对象
好处:代码简洁
坏处:只能调用公共无参构造
xxBean xx=null
xx=(xxBean) xxclass.newInstance();
3-2 操作属性 get--set方法 受访问修饰符限制
xxBean xx=new xxBean xx();
xxBean xx1=new xxBean xx1();
xx.name="大黄";
Filed thes=xxClass.getFiled("name"); 访问公共的name属性
thes.set(xx1,"小白") 给 Filed对象赋值,第一个参是代表给哪个独享的name属性赋值
thse.get(xx1) 给 Filed对象取值
3-3 调用探究到的方法
Method the=xxClass.getMethod("bark"); 访问 公共的 bark方法
the.invoke(方法名);

当数组做形参时 用 int...数组名的方式 可以省去写很多重载的方法







0 0
原创粉丝点击