Class类和ClassLoader类的简单介绍

反射机制中的Class

    Class内部到底有什么呢?看下图!

代码:  Class cls=Person.class;


1、Class类:
    1、  对象照镜子后可以得到的信息:某个类的数据成员名,方法和构造器、某个类到底实现了
       哪些接口。对于每个类而言,JRE都为其保留一个不变的Class类型的对象。一个Class对象包含可特定的某个类的有关信息。

    2、Class对象只能由系统建立对象。

    3、一个类在JVM中只会有一个Class实例。

    4、每个类的实例都会记得自己是由哪个Class实例产生的。

    5、Class本质上就是一个类!是一个用来描述指定类本身内部信息的一个类!

2、得到Class对象【三种方法】

    1、直接通过: 类名.class

            Class cls=Person.class;

    2、getClass()方式

            Object obj=new Person();
            Class cls2=obj.getClass();

    3、Class.forName("包名.类名")【最常用】【框架使用的最多】
            try {
                Class cls3=Class.forName("cn.sgg.reflections.Person");
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
3、反射中的泛型
    举例:
    Class<Person> cls3=(Class<Person>) Class.forName("cn.sgg.reflections.Person");

    Class<?> cls3=(Class<Person>) Class.forName("cn.sgg.reflections.Person");

    //?表示任意对象类型

4、Class类中的方法

    1、创建类的实例的方法:newInstance()

        Class cls3=Class.forName("cn.sgg.reflections.Person");

        Object obj=cls3.newInstance();//得到实例(通过:无参构造器)

        Object obj=cls3.newInstance(new Class[]{String.class,int.class});//得到实例(通过:有参构造器)

        说明:一般来说,一个类若声明了无参构造器,也要声明一个有参构造器!(有参的是留给反射用的!)

    2、Field<------>classType.getDeclaredFields();

    3、Method<----->getDeclaredMethod(getMethodName, new Class[]{});

    4、Constructor<------>getConstructor(new Class[]{int.class,String.class});

5、反射的在哪里被使用?

    框架中:      Servlet、Strust2等基础框架中......

6、类加载器:ClassLoader

    说明:
        ClassLoader:类加载器是用来把类(class)装进JVM的。JVM规范定义了两种类型的类装载器。

        启动类装载器(bootstap)

        用户自定义装载器(user-defined class loader)。

        JVM在运行时会产生3个类加载器组成的初始化加载器层次结构,

    如下图:
    

    举例:
        1、//获取一个系统类加载器
            ClassLoader classLoader=ClassLoader.getSystemClassLoader();
            System.out.println(classLoader);

        2、//获取一个系统类加载器
            ClassLoader classLoader=ClassLoader.getSystemClassLoader();
            System.out.println("系统加载器:"+classLoader);

        3、//获取系统类加载器的父类的加载器
            ClassLoader parentLoader=classLoader.getParent();
            System.out.println("系统加载器的父类加载器:"+classLoader);

        4、//获取扩展类加载器的父类加载器
             classLoader=parentLoader.getParent();
            System.out.println("扩展类加载器的父类加载器:"+classLoader);

        5、//检测当前类是由哪个类加载器加载的
            try {
                ClassLoader classLoader2=Class.forName("cn.sgg.reflections.TestReflect").getClassLoader();
                System.out.println(classLoader2);

            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }

        6、//检测JDK 提供的Object类由哪个类加载器负责加载的
            ClassLoader classLoader3;
            try {
                classLoader3 = Class.forName("java.lang.Object").getClassLoader();
                System.out.println(classLoader3);
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }

        7、关于类加载器的一个重要方法:

            系统类加载器可以加载本项目下的所有的对应的class文件和其他文件!/bin/xxx.文件后缀

            举例:
            //关于类加载器的一个重要方法:
               InputStream in=TestReflect.class.getResourceAsStream("xxxx.txt");

测试代码:

package cn.sgg.reflections;

/**
 *  反射--被测试类:
 */
public class Person {
    String name;
    private int age;    

    public Person(){}
    public Person(String name){
        this.name=name;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
}
package cn.sgg.reflections;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.lang.reflect.Field;

/**
 * 反射-测试类:
 *
 */
public class TestReflect {

    public static void main(String[] args) {
        new TestReflect().testClassLoader();
    }

    /**
     * 测试反射的方法
     */
    static void  getProperty(){

        //1、得到Class对象
            Class cls=Person.class;    

            Field[] fields=cls.getDeclaredFields();
        //2、得到Class对象
            Object obj=new Person();
            Class cls2=obj.getClass();
        //3、得到Class对象
            try {
                Class<?> cls3=(Class<Person>) Class.forName("cn.sgg.reflections.Person");

                //获得类实例
                Object obj1=cls3.newInstance();

            } catch (Exception e) {
                e.printStackTrace();
            }
    }

    static void testClassLoader(){

        //获取一个系统类加载器
        ClassLoader classLoader=ClassLoader.getSystemClassLoader();
        System.out.println("系统加载器:"+classLoader);

        //获取系统类加载器的父类的加载器
        ClassLoader parentLoader=classLoader.getParent();
        System.out.println("系统加载器的父类加载器:"+classLoader);

        //获取扩展类加载器的父类加载器
         classLoader=parentLoader.getParent();
        System.out.println("扩展类加载器的父类加载器:"+classLoader);

        //检测当前类是由哪个类加载器加载的
        try {
            ClassLoader classLoader2=Class.forName("cn.sgg.reflections.TestReflect").getClassLoader();
            System.out.println(classLoader2);

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

        //检测JDK 提供的Object类由哪个类加载器负责加载的
        ClassLoader classLoader3;
        try {
            classLoader3 = Class.forName("java.lang.Object").getClassLoader();
            System.out.println(classLoader3);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

        //关于类加载器的一个重要方法:
        InputStream in=null;
        in=TestReflect.class.getResourceAsStream("xxxx.txt");
    }
}
系统加载器:[email protected]
系统加载器的父类加载器:sun.misc.Laun[email protected]
扩展类加载器的父类加载器:null
[email protected]
null
得到图片的刘对象:null

原文地址:https://www.cnblogs.com/qlqwjy/p/8970620.html

时间: 2024-10-05 21:05:34

Class类和ClassLoader类的简单介绍的相关文章

Qt中利用QTime类来控制时间,这里简单介绍一下QTime的成员函数的用法:

---------------------------------------------------------------------------------------------------------------------------------------- QTime::QTime() 默认构造函数,构造一个时,分,秒都为0的时间,如00:00:00.000(午夜) QTime::QTime(int h, int m, int s=0, int ms = 0) 构造一个用户指定时

iOS开发—音频的播放的简单介绍和封装工具类

iOS开发—音频的播放的简单介绍和封装工具类 一.音效的播放简单介绍 简单来说,音频可以分为2种 (1)音效 又称“短音频”,通常在程序中的播放时长为1~2秒 在应用程序中起到点缀效果,提升整体用户体验 (2)音乐 比如游戏中的“背景音乐”,一般播放时间较长 框架:播放音频需要用到AVFoundation.framework框架 二.音效的播放 1.获得音效文件的路径 NSURL *url = [[NSBundle mainBundle] URLForResource:@"m_03.wav&qu

InputStreamReader 和 OutputStreamWriter类使用方法简单介绍,及演示。

InputStreamReader 和 OutputStreamWriter类使用方法简单介绍. 一.InputStreamReader类 InputStreamReader 将字节流转换为字符流.是字节流通向字符流的桥梁.假设不指定字符集编码,该解码过程将使用平台默认的字符编码,如:GBK. 构造方法: InputStreamReader isr = new InputStreamReader(InputStream in);//构造一个默认编码集的InputStreamReader类 Inp

Tstrings类简单介绍及实例

用TStrings保存文件;var  S: TStrings;begin  S := TStringList.Create();  { ... }  S.SaveToFile('config.txt', TEncoding.UTF8); Tstrings类简单介绍及实例 在DELPHI的程序开发过程中Tstrings类的使用是比较频繁的,下面就此类在DELPHI5的开发环境中进行一下简单的介绍及实例(注:本文只对tstrings类中的方法及属性进行介绍, 从其父类继承的属性及方法不属本文讨论之内

c++string类的简单介绍

#include "iostream" #include "string" using namespace std; /*@author:浅滩 *family:c++中string类的简单介绍 *time:2019.2.12 */ int main() { string s;//string类的创建 /*下述均是string的成员函数*/ s = "123";//=直接进行赋值 cout <<"字符串长度为:"&l

一.SalesForce中Schema类的简单介绍

一.Schema以及Schema NameSpace是什么 在SalesForce中Schema指的是应用程序中对象(Object)以及对象之间的各种关系.Schema NameSpace中包含了好多的类和方法,通过这些类和方法,可以访问Schema的一些基本信息. 二.Schema常用的类和方法 在Schema NameSpace中包含了很多的类以及方法,在此并不会对所有的类和方法做介绍,只会对其中几个类的几个方法做简单介绍. 1.Schema.getGlobalDescribe方法``这个方

Object类简单介绍

在java语言中有一个特殊类Object,该类是java.lang类库中的一个类,所有的类都是直接或间接地继承该类而得到的.所以说Object类是所有类的源. 故,我们今天就来好好地了解一下Object类的方法. Object类中有如下的一些方法: protected Object clone(),boolean equals(Object obj),protected void finalize(),Class<?>getClass() int hashCode(),void notify(

2015.12.22 类的三大特性 协议的简单介绍

类的三大特性:封装.继承.多态 封装: 1. 对于头文件里面的一些成员变量,可以使用@private @public @protected来限制权限 @public  公有的 类本身可以访问,子类可以继承,外部也可以访问 pxd->name @private 私有的 类本身可以访问,子类无法继承,外部不可以访问 @protected 受保护的 类本身可以访问, 子类可以继承, 外部不可以访问.默认就是protected 2.需要给外部使用的方法或者属性就定义在头文件里面声明.h 不需要暴露给外部

OC基础(十)类的本质及isa指针和元类的简单介绍

一.类的基本概念: 1.类其实也是一个对象, 这个对象会在这个类第一次被使用的时候创建 2.只要有了类对象, 将来就可以通过类对象来创建实例对象 3.实例对象中有一个isa指针, 指向创建自己的类对象 4.类对象中保存了当前对象所有的对象方法 5.当给一个实例对象发送消息的时候, 会根据实例对象中的isa指针去对应的类对象中查找 6.所有类对象的继承关系就是元类对象的继承关系 二.isa指针 1.每一个对象都包含一个isa指针.这个指针指向当前对象所属的类. 2.[d bark];表示给d所指向