zoukankan      html  css  js  c++  java
  • Java 反射机制

    1.什么是反射

    JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法(包括非public的);对于任意一个对象,都能够调用它的任意一个方法。Reflection(反射)是被视为动态语言的关键。

    2.Java反射机制提供的功能

    • 在运行时判断任意一个对象所属的类
    • 在运行时构造任意一个类的对象
    • 在运行时判断任意一个类所具有的成员变量和方法
    • 在运行时调用任意一个对象的成员变量和方法
    • 生成动态代理
            // 1、通过反射创建对象
            Class<Person> clazz = Person.class;
            Person p = clazz.newInstance();
            System.out.println(p);
    
            Constructor<Person> constructor = clazz.getConstructor();
            Person p3 = constructor.newInstance();
            System.out.println(p3);
    
            // 使用Class.forName()的静态方法jvm会装载并且执行 static {
            // }中的代码,而Class.Loader.loadClass()不会执行static{}的代码。
            Class<?> clazz1 = ClassLoader.getSystemClassLoader().loadClass("com.test.Person");
            Person p1 = (Person) clazz1.newInstance();
            System.out.println(p1);
    
            // 推荐使用此方法
            Class<?> clazz2 = Class.forName("com.test.Person");
            Person p2 = (Person) clazz2.newInstance();
            System.out.println(p2);
    
            // 2、通过反射访问属性及修改
            Field nameField = clazz2.getField("name");// public 的属性名
            nameField.set(p2, "TestName");
    
            Field ageField = clazz2.getDeclaredField("age");// 获得声明的指定字段
            ageField.setAccessible(true);
            ageField.set(p2, 20);
            System.err.println(p2);
    
            // 3、通过反射访问方法及调用
            Method pubMethod = clazz2.getMethod("printName");// public 的方法
            pubMethod.invoke(p2);
    
            Method nonPubMethod = clazz2.getDeclaredMethod("privateMethod", String.class);// 获得声明的指定方法
            nonPubMethod.setAccessible(true);
            nonPubMethod.invoke(p2, "testReflection");

     3. Class类

    某个类的属性、方法和构造器、某个类到底实现了哪些接口。对于每个类而言,JRE 都为其保留一个不变的 Class 类型的对象。一个 Class 对象包含了特定某个类的有关信息。

    Class本身也是一个类

    Class 对象只能由系统建立对象

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

    一个Class对象对应的是一个加载到JVM中的一个.class文件

    每个类的实例都会记得自己是由哪个 Class 实例所生成

    通过Class可以完整地得到一个类中的完整结构

     

     4. ClassLoader类

    类加载器是用来把类(class)装载进内存的。JVM 规范定义了两种类型的类加载器:启动类加载器(bootstrap)和用户自定义加载器(user-defined class loader)。 JVM在运行时会产生3个类加载器组成的初始化加载器层次结构 ,如下图所示

    //1.获取一个系统类加载器
    ClassLoader classloader = ClassLoader.getSystemClassLoader();
    System.out.println(classloader);
    //2.获取系统类加载器的父类加载器,即扩展类加载器
    classloader = classloader.getParent();
    System.out.println(classloader);
    //3.获取扩展类加载器的父类加载器,即引导类加载器,无法直接获取
    classloader = classloader.getParent();
    System.out.println(classloader);
    //4.测试当前类由哪个类加载器进行加载
    classloader = 
    Class.forName("exer2.ClassloaderDemo").getClassLoader();
    System.out.println(classloader);

    //5.测试JDK提供的Object类由哪个类加载器加载
    classloader = 
    Class.forName("java.lang.Object").getClassLoader();
    System.out.println(classloader);
    //*6.关于类加载器的一个主要方法:getResourceAsStream(String str):获取类路径下的指定文件的输入流
    InputStream in = null;
    in = this.getClass().getClassLoader().getResourceAsStream("exer2\test.properties");
    System.out.println(in);

    -----------------------------------------------------------------------------------------

    1.实现的全部接口

    • public Class<?>[] getInterfaces()  

    确定此对象所表示的类或接口实现的接口。

     

    2.所继承的父类

    • public Class<? Super T> getSuperclass()

    返回表示此 Class 所表示的实体(类、接口、基本类型)的父类的 Class

     

    3.全部的构造器

    • public Constructor<T>[] getConstructors()

    返回此 Class 对象所表示的类的所有public构造方法。

    • public Constructor<T>[] getDeclaredConstructors()

    返回此 Class 对象表示的类声明的所有构造方法。

    l  Constructor类中:

    • 取得修饰符: public int getModifiers();
    • 取得方法名称: public String getName();
    • 取得参数的类型:public Class<?>[] getParameterTypes();
    •  

    4.全部的方法

    • public Method[] getDeclaredMethods()

    返回此Class对象所表示的类或接口的全部方法

    • public Method[] getMethods() 

    返回此Class对象所表示的类或接口的public的方法

    l  Method类中:

    • public Class<?> getReturnType()取得全部的返回值
    • public Class<?>[] getParameterTypes()取得全部的参数
    • public int getModifiers()取得修饰符
    • public Class<?>[] getExceptionTypes()取得异常信息

    5.全部的Field

    • public Field[] getFields()

    返回此Class对象所表示的类或接口的public的Field。

    • public Field[] getDeclaredFields()

    返回此Class对象所表示的类或接口的全部Field。

    l  Field方法中:

    • public int getModifiers()  以整数形式返回此Field的修饰符
    • public Class<?> getType()  得到Field的属性类型
    • public String getName()  返回Field的名称。

    6. Annotation相关

    • get Annotation(Class<T> annotationClass)
    • getDeclaredAnnotations()

    7.泛型相关

    获取父类泛型类型:Type getGenericSuperclass()

    泛型类型:ParameterizedType

    获取实际的泛型类型参数数组:getActualTypeArguments()

    8.类所在的包    Package getPackage()

  • 相关阅读:
    hdu 2222 Keywords Search
    Meet and Greet
    hdu 4673
    hdu 4768
    hdu 4747 Mex
    uva 1513 Movie collection
    uva 12299 RMQ with Shifts
    uva 11732 strcmp() Anyone?
    uva 1401
    hdu 1251 统计难题
  • 原文地址:https://www.cnblogs.com/pjlhf/p/8669807.html
Copyright © 2011-2022 走看看