• 反射(学习整理)----Class类和加载器ClassLoader类的整理


    1、学习反射的时整理的笔记!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");

     

    2、下面是测试代码:

    测试类1:

     1 package cn.sgg.reflections;
     2 
     3 /**
     4  *  反射--被测试类:
     5  *    Created by Jason  2016-7-16  下午2:19:40
     6  */
     7 public class Person {
     8     String name;    
     9     private int age;    
    10     
    11     public Person(){}    
    12     public Person(String name){
    13         this.name=name;
    14     }
    15     public String getName() {
    16         return name;
    17     }
    18     public void setName(String name) {
    19         this.name = name;
    20     }
    21     public int getAge() {
    22         return age;
    23     }
    24     public void setAge(int age) {
    25         this.age = age;
    26     }
    27 }

     测试类2:

     

     1 package cn.sgg.reflections;
     2 
     3 import java.io.FileInputStream;
     4 import java.io.FileNotFoundException;
     5 import java.io.InputStream;
     6 import java.lang.reflect.Field;
     7 
     8 /**
     9  * 反射-测试类:
    10  *    Created by Jason  2016-7-16  下午2:22:05
    11  */
    12 public class TestReflect {
    13 
    14     public static void main(String[] args) {
    15         new TestReflect().testClassLoader();
    16     }
    17     
    18     /**
    19      * 测试反射的方法
    20      */
    21     static void  getProperty(){
    22         
    23         //1、得到Class对象
    24             Class cls=Person.class;    
    25             
    26             Field[] fields=cls.getDeclaredFields();
    27         //2、得到Class对象    
    28             Object obj=new Person();
    29             Class cls2=obj.getClass();
    30         //3、得到Class对象    
    31             try {
    32                 Class<?> cls3=(Class<Person>) Class.forName("cn.sgg.reflections.Person");
    33                 
    34                 //获得类实例
    35                 Object obj1=cls3.newInstance();
    36                 
    37             } catch (Exception e) {
    38                 e.printStackTrace();
    39             } 
    40     }
    41     
    42     
    43     static void testClassLoader(){
    44         
    45         //获取一个系统类加载器
    46         ClassLoader classLoader=ClassLoader.getSystemClassLoader();
    47         System.out.println("系统加载器:"+classLoader);
    48         
    49         //获取系统类加载器的父类的加载器
    50         ClassLoader parentLoader=classLoader.getParent();
    51         System.out.println("系统加载器的父类加载器:"+classLoader);
    52         
    53         //获取扩展类加载器的父类加载器
    54          classLoader=parentLoader.getParent();
    55         System.out.println("扩展类加载器的父类加载器:"+classLoader);
    56         
    57         //检测当前类是由哪个类加载器加载的
    58         try {
    59             ClassLoader classLoader2=Class.forName("cn.sgg.reflections.TestReflect").getClassLoader();
    60             System.out.println(classLoader2);
    61         
    62         } catch (ClassNotFoundException e) {
    63             e.printStackTrace();
    64         }
    65         
    66         //检测JDK 提供的Object类由哪个类加载器负责加载的
    67         ClassLoader classLoader3;
    68         try {
    69             classLoader3 = Class.forName("java.lang.Object").getClassLoader();
    70             System.out.println(classLoader3);
    71         } catch (ClassNotFoundException e) {
    72             e.printStackTrace();
    73         }
    74         
    75         //关于类加载器的一个重要方法:
    76         InputStream in=null;
    77         in=TestReflect.class.getResourceAsStream("xxxx.txt");
    78     }
    79 }

     测试结果: 

    系统加载器:sun.misc.Launcher$AppClassLoader@18d107f
    系统加载器的父类加载器:sun.misc.Launcher$AppClassLoader@18d107f
    扩展类加载器的父类加载器:null
    sun.misc.Launcher$AppClassLoader@18d107f
    null
    得到图片的刘对象:null
  • 相关阅读:
    .NET安全系列之六:强名程序集
    Flash Player10.1.102.64版本后,跨域访问不支持带中文的地址
    ArcSDE 服务启动后又停止的解决方式一例
    ArcGIS Engine Maplex Label(标注)使用一例
    设置frameset的framespacing的颜色
    html表格导出Excel的一点经验心得
    解决Unable to create logfile system tables. User perhaps lacks permissions or resources to create tables
    WCF方法重载
    respond_to 和 respond_with
    Linux Apache服务器相关的重要目录
  • 原文地址:https://www.cnblogs.com/newwind/p/5676646.html
Copyright © 2020-2023  润新知