牛骨文教育服务平台(让学习变的简单)
博文笔记

反射,类加载与垃圾回收

创建时间:2016-11-27 投稿人: 浏览次数:241
本章重点: 1.理解类的加载,连接和初始化过程。 2.理解类加载机制。 3.理解反射机制,反射的使用方法 4.理解垃圾回收 :反射是什么,是做什么,与动态多态的关系 ----→ web , EE
-------------------------------------------------------------------------------------------------------- 1.类加载。
类加载:把编译好的class文件加载到内存中(同时创建一个java.lang.Class对象)。一旦某 个类被载入JVM中,同一个类不会被再次载入 -----Class类是专门用来装类信息(注释除外)的, 被称为:类模版对象(一种只有一个) xxxx,new出来的对象:实例对象(可有多个) 连接:把类的二进制数据合并到JRE中。 初始化:JVM负责对类进行初始化,也就是对静态属性进行初始化。 静态属性初始化(数据段-静态区): 1.声明时指定初始值。 2.使用静态初始化块为静态属性赋值。 String str = new String(" hello "); ---这句代码产生2个字符串对象,3个对象(class对象)。
----------反射; :使用反射可以获得java类中各个成员的名称并显示出来。反射就是可以让你通过名称来得到 对象的技术。 作用:在运行时探究和使用编译时未知的类。 -反射使用三个步骤: 1.获得想要操作的类的Class对象(java.lang.Class) 2.调用诸如 getDeclaredMethods 3.使用reflection API来操作这些信息。 API: 1. 反射第一步:获取Class对象 1>. 调用实例对象的来自于Object中的方法getClass()方法 --特点:1.可以得到所有类和数组的Class对象 2.getClass方法,没有编译时未知,运行时探究的动态效果。 eg: DogBean snoopy = new DogBean( ); Class dogClass = snoopy.getClass( ) ; 2>.利用语法类型名.class 的方式获取到class对象。 --特点:1.所有类型(不管是基本数据类型还是引用数据类型,甚至返回 类型void)都可以得到相应的class对象 2.仍然没有编译时未知,运行时探究的动态效果。 eg: Class dogClass1 = DogBean.class ; Class intArray = int[].class; Class intClass = int.class; //JDK1.5之前: -----Class integerClass = Integer.class; -----Class intClass1 = Integer.TYPE; //void也是一种类型,所以也有Class对象 Class voidClass = void.class; 3>.利用Class.forName("字符串形式的类型名");获取class对象(动态加载) --特点:1.不支持基本数据类型,返回类型和数组获取相应的Class对象。 2.唯一有编译时未知,运行时探究的动态效果。 Class dogClass2 = Class.forName("com.lovo.bean.DogBean"); 2.探究类的信息。 1.探究类的基本声明部分。 String str = dogClass .getPackage( ) .getName( ); 探究包名 String str = dogClass.getName(); 探究类全名(类的限定名) String str = dogClass.getSimpleName(); 探究类的简单名 int intMod = dogClass.getModifiers();得到修饰符(访问+可选) String classModStr = Modifier.toString(intMod);使用工具类把整型的 修饰符表示转换为字符串的修饰符表示 dogClass.getSuperClass( ); 得到父类的class对象 dogClass.getInterfaces(); 得到实现的接口,返回的是class数组。因为接 口可以多实现 2.探究属性 1.探究所有属性---Field Field[] allPublicFields = dogClass.getFields; //得到的所有的公共属性 (包括父类继承而来的公共属性) Field[] allFields =dogClass.getDeclaredFields( ); 得到在子类身上声 明的所有属性 2.探究某个指定的属性。 Field field = dogClass.getField("属性的名字");//得到指定的公共属性 (包括父类继承而来的) Field field = dogClass.getDeclaredField("属性的名字"); 得到指定 的申明属性,不包括来自父类的。 3.探究构造(Constructor) 1.探究所有构造。 Constructor[] con = dogClass.getConstructors;//得到所有的公共 构造 Constructor[] con = dogClass.getDeclaredConstructors;//得到所 有的声明构造 2.探究指定构造。 Constructor con = dogClass.getConstructor(); Constructor con =dogClass.getDeclaredConstructor(String.class int.class , boolean.class);
con.getParameerTypes(); 得到形参列表 返回的是class[ ] con.getExceptionTypes(); 得到异常类型,返回的也是class[] --------传参:传入参数的列表。 4.探究方法。(Method) 1.探究所有方法。 2.探究指定的方法 --------传参:方法名,参数列表 3.使用探究到的类的信息。 1、使用反射创建对象。----第三种创建对象的方法。 1>.根据探究到的Constructor对象产生类的实例对象 好处:可以调用类中的任意构造方法。 坏处:实现过于麻烦。 调用 Constructor theCon = dogClass.getDeclaredConstructor(String.class,int.class,boolean. class) theCon.setAccessible(true);设置theCon的访问权限为可访 --一般不用,因为破坏了封装。 dog =(DogBean)theCon.newInstance("旺财",5,true); 反射创建对象也要受访问修饰符的限制。 2>.直接利用class对象产生实例对象。 好处:代码简洁。 坏处:只能调用公共无参构造。 DogBean = null ; dog = (DogBean)dogClass.newInstane(); 2、操作属性。----都用的是get/set方法 也是要受访问修饰符限制。 也可用setAccessible(); thePublicField.set( 赋值的对象 ,"新值") get(同理 ,不过只传入对象) 3、调用探究到的方法。 也是要受访问修饰符限制。 也可用setAccessible(); Method thePublicMethod = dogClass.getMethod("bark"); thePublicMethod.invoke(传入调用的对象);
-----内部设计的时候,数组作为形参的时候 用 : 类型 . . . 数组名字 这样的形式进行传递。 ------------------------------------------------------------------------------------------
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。