关于Class类的学习(反射~类加载器~)

今天回顾了一下反射,发现又了解了一点点知识记此!

首先说反射,通过反射先去理解这个class类,这样后面的理论理解会容易点

反射的机制是在运行过程中,动态获取信息或动态调用对象方法的功能,分为3个动态性质

1 运行时生成动态实例

2运行期间调用方法

3运行时更改属性

所以java反射机制是能够探知类的基本结构,这种探知能力称为java类的“”自审“”例如eclipse对应类的代码提示(方法调用,属性调用)就是用了探知和自审的能力,

直接说应用

一,获取类的信息

      分两个步骤1获取Class对象,2利用得到的Class对象获得信息

       1获取Class对象三种方式

               1 Student s = new Student();

                Class  cla = s.getClass()

              2Class cla = Student.class;

               3  Class cla = Class.forName("com.fjp.entity.Student")       

    2利用得到的Class对象获得信息

         大概说一下,Class对象提供了一些能获取

                       “”构造器的方法“”          ,“获取对应类的方法的方法”,           “获取对应类的属性的方法” ,

   对与获取类的信息的方法在访问权限上也是有涉及就比如 private的访问权限,不同访问级别Class类有不同的访问的方法进行区分

二,得到的信息相应的访问

  比如得到   构造器的信息可以访问用来创建对象,方法的信息用来调用,属性的信息 进行属性值的操作,

举例子 创建对象  Class cla = Data.class;

                           Data  d = cla.newInstance();//利用本身默认的构造方法创建,

如果不是利用默认的构造则   :

                     Class cla = Data.class;

                        Constructor  cu =  cla.getConstructor(Long.class)

                           Data  d = cu.newInstance();

访问属性

   Student stu = new Student();

    Class cla  =Student.class;

Field  nameField = cla.getDeclaredField("name")//得到Student的name属性

nameField.setAccessible(true);//把private String name 访问权限位private的属性授权

nameField.set(stu,"Tom");

访问方法

Method md = cla.getMethod("setName",String.class);

md.invoke(stu,"jack");//对于student类的setName方法设置参数是jack

Method md2 = cla.getMethod("getName",null);

Object ot = md2.invoke(stu,null);//调用get

     上边说的有点远了,但对于理解class类还是有帮助的,现在要说比较抽象的理论啦!

java是面向对象语言,万物都是对象,对于我们写的类如A.java相对于Class 类来说是一个对象,A.java中的方法还有属性也都是Class的对象,所以this.class是获得这个类相对于Class类的对象(结合上面的反射可以更好的体会到),

平时讲述某某类,但是我们并没有说这个类怎么和虚拟机打交道,虚拟机怎么识别这个类.总不能全靠字符串吧. 所以呢java就设计了Class这个类.用于虚拟机对类的管理.当一个类被虚拟机装载完毕的时候,就会创建一个Class类的实例,对于类A就是A.class,对于类B就是B.class. Class类也提供了许多方法来获取类的信息. 要知道,类的装载器分为 "启动类装载器 ", "用户定义装载器 ".它不止一种 Class类需要保存这些信息. getClassLoader()是用来获取这个信息的

百度百科中:Class的解释——:在Java中,每个class都有一个相应的Class对象。也就是说,当我们编写一个类,编译完成后,在生成的.class文件中,就会产生一个Class对象,用于表示这个类的类型信息。

那么现在如果你理解这样一句话就说明你懂了!

ConfigManager.class.getClassLoader().getResourceAsStream("database.properties");

解释:得到ConfigManager类对应Class类的对象,通过类加载器getClassLoader负责从Java字符文件将字符流读入内存,最后get到database.properties这个资源,,通过它可以得到一个文件的输入流

类加载器:getClassLoader():取得该Class对象的类装载器
类装载器负责从Java字符文件将字符流读入内存,并构造Class类对象,

                

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值