java基础19(Javaoo14)—— 反射,类加载与垃圾回收

本章重点:
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.get Declared Fields( ); 得到在子类身上声
明的所有属性
2.探究某个指定的属性。
Field field = dogClass.getField("属性的名字");//得到指定的公共属性
(包括父类继承而来的)
Field field = dogClass.get Declared Field("属性的名字"); 得到指定
的申明属性,不包括来自父类的。
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(传入调用的对象);

-----内部设计的时候,数组作为形参的时候
用 : 类型 . . . 数组名字
这样的形式进行传递。
------------------------------------------------------------------------------------------


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值