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");
    }
}
系统加载器:sun.misc.Launcher$AppClassLoader@18d107f
系统加载器的父类加载器:sun.misc.Launcher$AppClassLoader@18d107f
扩展类加载器的父类加载器:null
sun.misc.Launcher$AppClassLoader@18d107f
null
得到图片的刘对象:null

猜你喜欢

转载自www.cnblogs.com/qlqwjy/p/8970620.html