初识反射

目录

 

1.认识反射机制:

2.三种实例化对象

3.反射与类操作:

4.ClassLoader类加载器


1.认识反射机制:

        反射:

        反射指的是对象的反向处理操作,所谓的额“反“指的是根据对象来取得对象的来源信息,而这个”反”的操作核心的处理就在于Object类的一个方法:

取得Class对象:

    Public fianl native Class<?> getClass();

    该方法返回的是一个Class类对象,这个Class描述的就是类。

在反射的世界里面,看重的不再是一个对象,而是对象身后的组成(类、构造、普通成员等)

 

2.三种实例化对象

    Class类是描述整个类的概念,也是整个反射的操作源头,在使用Class类的时候需要关注的依然是这个类的对象,而这个类的产生模式一共有三种:

  1. 任何类的实例化对象可以通过Object类中的getClass()方法取得Class类对象。
  2. “类.class”:直接根据某个具体的类来取得Class类的实例化对象
  3. 使用Class类提供的方法:public static Class<?> forName(String className) throws ClassNotFoundException

3.反射与类操作:

    1)取得父类信息:

       在Java中任何的程序都一定会有父类,在Class类中就可以通过如下方方法来取得父接口或者实现的父接口:

  1. 取得类的包名称:public Package getPackage()
  2. 取得父类的Class对象:public native Class<? Super T> getSuperclass();
  3. 取得实现的父接口:public Class<?>[] getInterfaces();

   2)反射调用构造

   一个类中可以存在多个构造方法,如果想要取得类中构造的嗲用,就可以使用Class类中提供的两个方法:

取得指定参数类型的构造:

Public  Constructor<T> getConstructor(Class<?>… paramenterTypes)throws NoSuchMethodException,SecurityException

Class类通过反射实例化类对象的时候,只能嗲用类中的无参构造。如果现在类中没有无参构造则无法使用Class类调用,只能够通过明确的构造调用实例化处理。

    3)反射调用普通方法(核心)

       类中普通方法的反射调用你在开发之中一定会使用到,并且使用好了可以计生大量的重复编码。在Class类中有如下两种取得类中普通女方法的函数:

取得全部普通方法

Public Method[] getMethods() throws SecurityException

取得指定普通方法:

Public Method getMethod(String name,class<?>… parameterTypes)

调用

   4)反射调用类中属性:

在之前已经成功的实现了类的构造调用、方法调用,除了这两只能够模式之外还有类中属性调用。

前提:类中的所有属性一定在类对象实例化之后曹辉进行空间分配,所以此时如果想要嗲用类的属性,必须保证有实例化对象。通过反射的newInstance()可以直接取得实例化对象(Object类型)

在Class类中提供有两组取得属性的方法:

    a.(父类中取得类的全部属性):public Filed[] getFileds() throws SecurityException

    b.(父类中取得类中全部属性):public Filed getFiled(String name)throws NoSuchFiledException,SecurityExceptio

    c.(本类中,取得类中全部属性):public Filed[] getDeclaredFileds()throws Securityexception

    d.(本类中,取得类中指定名称属性):public Method  getDeclaredMethod(String name,Class<?>…parameter Types)throws NoSuchMethodException,SecurityException

4.ClassLoader类加载器

       Class类描述的是整个类的信息,在class类中提供的forName()方法,这个方法根据和ClassPath配置的路径进行类的加载,如果说现在你的类加载路径可能是网络、文件,这个时候就必须实现类加载器,也就是ClassLoader类的主要作用。

 

   4.1 类加载器的定义:

    JVM设计团队把类加载阶段中的“通过一个类的全限定名来获取描述此类的二进制字节流”这个动作放在java 虚拟机外部去实现,以便让应用程序自己决定如何去获取所需要的类。实现这个动作的代码模块称之为“类加载器”。

 

    Bootstrap(类加载器):这个类加载器使用C++实现,是虚拟机自身的一部分;其他的类加载器都由Java语言实现,独立于JVM外部并且都继承于java.lang.ClassLoader.BootStrap类加载器负责存放与<Java_HOME>\lib目录中(或者被-Xbootclasspath参数指定路径中)能被虚拟机识别的仅按照文件名识别,如rt.jar,名字不符合的类库及时放在lib目录中也不会被加载)类库加载到JVM内存中。启动类中加载器无法被java 程序直接引用。 

   

    ExtClassLoader(扩展类加载器):它负责加载<Java_HOME>\lib\ext目录中,或者直接被java.ext.dirs系统变量指定的路径中的类库。开发者可以直接使用扩展类加载器。

 

    AppClassLoader(应用程序类加载器):负责加载用户路径(ClassPath)上指定的类库,如果应用程序中没哟自定义自己的类加载器,则此加载器就是程序中默认的类加载器。

 

  4.2  双亲委派模型

    我们的应用程序都是由这三种加载器互相配合进行加载的,如果有必要,还可以加入自定义的类加载器。

双亲委派模型要求除了顶层的父类加载器外,其余的类加载器都应有自己的父类加载器。

 

      双亲委派模型的工作流程是:如果一个类加载器收到来加载请求,它首先不会自己去尝试加载这个类。而是把这个请求委托给父类加载器去完成,每一个层次的类加载器都是如此。因此,所有的加载请求都应当传送到顶层的BootStrap加载器中,只有当父类加载器反馈无法完成这个类加载器请求时(在自己搜索范围中没有找到此类),子加载器才会尝试自己去加载。

 

      类加载器的双亲委派模型从JDK1.2引入后广泛应用之后几乎所有的Java程序中,但它并不是强制性约束,甚至可以破 坏双亲委派模型来进行类加载,最典型的就是OSGI技术。

      双亲委派模型模式对于保证Java程序的稳定性运行很重要。有一个显而易见的好处就是Java类随着它的类加载器一起具备了一种带有优先级的层次关系。例如java.lang.Object类,它存放在rt.jar中,无论哪一个类加载器要加载这个类,最终都是委派给处于顶端的启动类加载器进行加载。因此,Object类在程序的各种类加载环境中都是同一个类。

 

   

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值