zoukankan      html  css  js  c++  java
  • java 深入技术七(类的结构和反射)

    1.java反射(reflect)

    java 类的结构

    java反射机制就是把java类按结构分解,每一部分对应特定的反射类

    java反射机制允许运行时加载,探知和使用在编译期间完全未知的classes,换句话说,java程序可以加载一个运行时才得知名称的class,获悉其完整结构信息

    一个.class类对应一个Class反射类

    字段对应一个反射类Field

    Field类的对象是 字段

    构造函数对应一个反射类Constructor

    方法对应一个反射类Method

    2. _Class类

    代表一个.class文件

    Class  forName(String className)  //通过类的全类名加载该类 手动的加载一个类

    全类名:包名+类名

    Constructor getConstructor(Class...parameterTypes) //获取一个类内部的构造函数

    parameterTypes //参数类型 用public修饰的构造函数

    Constructor[] getConstructors()  //获得所有的public构造函数,包括父类的

    Constructor getDeclaredConstructor(Class...parameterTypes) //获得自定义的构造函数

    Constructor  getDeclaredConstructors()  //获得类自己声明的所有构造函数,包括私有的private

    Class.getConstructor(String name,int age)

    Field getField(String name) //获得字段

    Field[]  getFields() //获得所有的public字段,包括父类的

    Field getDeclaredField(String name) //获得自定义的字段

    Field[] getDeclaredFields() //获得类自己声明的所有字段

     Method getMethod(String name,Class...parameterTypes) //方法的类型

    Method[] getMethods[] //获得所有的public方法

    Method getDeclaredMethod(String name,Class...parameterTypes)

    Method[] getDeclaredMethods()  //获得自己声明的所有方法

    Package  getPackage() //获得此类的包的对象

    int  getModifiers()  //获得此类的修饰符

    String  getName() //获得此类的名称

    Object  newInstance() //使用无参数构造方法创建此类的对象

    Class 类的实例表示正在运行的java程序的类和结构

    枚举是一种类,注释是一种接口

    java.lang 包下的类

    1).首先获得Class对象加载类:直接类名.class

                                           类对象.getClass()

                                           Class.forName(包名+类名)

    2).通过Class对象获得类的构造方法,字段,方法

     3).通过Class对象获得类的包名,getPackage()

    3._Constructor类

    Constructor表示一个类的构造函数的对象

    **Object  newInstance(Object...inittargs) //创建一个对应类的对象,可变参数:有参或无参

    构造函数是有参数的

    Class[] getParameterTypes() //获得所有参数的类型

    String getName() //获得构造函数名称

    int getModifiers() //获得此构造函数的修饰符(public private protected)

    Class[] getExceptionTypes() //获得此构造函数声明,抛出的异常类型

    Object getAnnotation(Class annotationClass)   //获得注释对象

    4._Field类

    表示一个类的字段

    **Class getType() //获得此字段的类型

    Class getDeclaringClass() // 获得声明此字段的类的类型

    String getName() //获得此字段的名称

    int getModifiers() //获得此字段的修饰符

    **Object get (Object obj)  //获得此字段在指定对象中的值

    boolean getBoolean(Object obj) //获得此字段在指定对象中的布尔值

    byte getByte(Object obj)  //获得byte值

    **void set(Object obj,Object value) //设置此字段在指定对象中的值

    void setBoolean(Object obj,boolean z)

    AccessibleObject

    取消反射对象(Constructor,Fields,Method)的访问限制

    void setAccessible(boolean flag)

    java 对象的序列化会使用到此特性

     5._Method 类

    对应类中的方法

    Class getDeclaringClass() //获得声明此方法的类的Class对象

    Class[] getExceptionTypes() //获得此方法声明抛出的异常类型

    int getModifers()  //获得此方法的修饰符

    String getName()  //获得此方法的名称

    Class[] getParameterTypes() // 获得此方法的参数的类型

    Class getReturnType() //获得此方法的返回值类型

    Objectinvoke(Object obj,Object...args) //使用指定对象调用此方法Method对应的对象

    objPerson类的一个对象

    创建类的对象

    1. Class clazz=Person.class;

    clazz.newInstance();

    2. Construnctor constructor=clazz.getDeclaredConstructor();

    constructor.newInstance();

    6.Modifier 类

    专门代表一个修饰符(方法,或类的修饰符)

    static int abstract final interface native private protected public

    static boolean isPublic isPrivate isProtected

     总结

    构造函数:无参和有参

    Class clazz = Class.forName("com.reflect.Person");
      // 通过Class对象获得Constructor类对象
      Constructor constructor = clazz.getDeclaredConstructor();
      // 有两个参数的构造函数
      Constructor constructor2 = clazz.getConstructor(String.class,
        Integer.class);

    //有参的对象

    Object o2 = constructor2.newInstance("李丹", 30);

    //无参的对象

    Object o = constructor.newInstance();

    字段:

    Field nameField = clazz.getDeclaredField("name");

    // 取消private访问限制
      nameField.setAccessible(true);
      nameField.set(person, "蛋蛋");

    Person person = (Person) clazz.newInstance();

    //获得Person类中的name字段

    Object o = nameField.get(person);

    方法:有参和无参,还有方法的调用

     // 根据方法名获得指定的方法
     Method sayHello = clazz.getDeclaredMethod("sayHello");

    //对象调用参数

    Person person = (Person) clazz.newInstance();

    sayHello.invoke(person);

    Method singMethod = clazz.getDeclaredMethod("sing", String.class);
      Person person = (Person) clazz.newInstance();
      // 对象调用sing方法
      singMethod.invoke(person, "小苹果");

     10.java 反射可以做什么

    1.java对象的序列化

    2.封装框架提供通用功能

    3.为程序提供扩展功能

  • 相关阅读:
    element-ui获取table行数据
    去掉输入框的边框以及在显示获取焦点时的边框+jq日期选择器
    需要ui的小伙伴看过来(这篇博客只有一个链接希望对大家有用)
    vue获取当前对象
    FlashFXP用到的功能
    VS Code做项目的笔记
    单点登陆
    idea中自动生成实体类
    VSCode安装
    数组排序
  • 原文地址:https://www.cnblogs.com/shiyeyeyeye/p/5072640.html
Copyright © 2011-2022 走看看