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

    反射概述

    什么是反射?

       反射的概念是由Smith1982年首次提出的,主要指程序可以访问、检测和修改它本身状态或行为的一种能力。

       JAVA反射机制是在运行状态中,对应任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种状态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制。

       简单的说,反射机制指的是程序在运行时能够获取自身的信息。在java中,只要给定类的名字,那么就可以通过反射机制来获得类的所有信息。包括其访问修饰符、父类、实现的接口、属性和方法的所有信息,并可在运行时创建对象、修改属性(包括私有的)、调用方法(包括私有的)。

     

    反射机制

       为什么要用反射机制?直接创建对象不就可以了吗,这就涉及到了动态和静态的概念?

    a)         静态编译:在编译时确定类型,绑定对象,即通过。

     Student stu=new Student(“zhangsan”,20);

    b)         动态编译:运行时确定类型,绑定对象。动态编译最大限度发挥了java的灵活性,体现了多态的应用,用以降低类之间的耦合性。

      Class.forName(“com.mysql.jdbc.Driver.class”).newlnstance();

    c)         反射机制的优点就是可以实现动态创建对象和编译,体现出很大的灵活性,特别是J2EE的开发中。

    d)         它的缺点是对性能有影响,使用反射基本上是一种解释操作,这类操作总是慢于直接执行的相同操作。

     

    Java反射机制主要提供了以下功能

       在运行时判断任意一个对象所属的类

       在运行时构造任意一个类的对象

       在运行时判断任意一个类的所具有的成员变量和方法

       在运行时调用任意一个对象的方法

     

    Class对象

       Class对象是Reflection故事起源。要想操作类中的属性和方法,都必须从获取Class对象开始。

    a)         类是程序的一部分,每个类都有一个Class对象。换言之,每当编写并编译一个新类,就会产生与之对应的一个Class对象。

    b)         Class类没有公共构造方法。Class对象是在加载类时由Java虚拟机以及通过调用类加载器中的方法自动构造的,因此不能显式地声明一个Class对象。

       获取Class对象的方法有多种

     

    获取方式

    说明

    示例

    object.getClass()

    获取指定示例的

    Class

    String str=”abc”;

    Class c1=str.getClass();

    class.getSuperclass()

    获取当前Class

    的继承类的

    Class

    List list=new ArrayList();

    Class listClass=list.getClass();

    Class superClass=

    listClass.getSuperClass();

    .class语法

    .class直接获取

    Class listClass=ArrayList.class;

    Class.forName(类名);

    Class的静态方法,传入类的全称即可

    Class c1=Class.

    forName(“java.lang.String”);

    Primitive.TYPE

    基本数据类型的包装类获取Class的方式

    Class longClass=Long.TYPE;

    Class integerClass=Integer.TYPE;

    Class voidClass=Void.TYPE;

     

     

    示例:

    创建一个雇员类

     1 class Employee {
     2     private String name;
     3     private int age;
     4 
     5     public String getName() {
     6         return name;
     7     }
     8 
     9     public void setName(String name) {
    10         this.name = name;
    11     }
    12 
    13     public int getAge() {
    14         return age;
    15     }
    16 
    17     public void setAge(int age) {
    18         this.age = age;
    19     }
    20 
    21     public Employee(String name, int age) {
    22         super();
    23         this.name = name;
    24         this.age = age;
    25     }
    26 
    27 }

    主方法中获取Class对象:

     1     public static void main(String[] args) {
     2         Employee employee = new Employee("zhansan", 20);
     3 
     4         // 对象名.getClass()
     5         /*
     6          /* Class<?> classType = employee.getClass();
     7          * System.out.println(classType.getName());
     8          * System.out.println(classType.getSuperclass().getName());
     9          */
    10 
    11         // 类名.class
    12         /*
    13          * Class<?> classType=Employee.class;
    14          * System.out.println(classType.getName());
    15          * System.out.println(classType.getSuperclass().getName());
    16          */
    17 
    18         // 使用Class.forName();
    19         /*try {
    20             Class<?> classType = Class.forName("com.iotek.classtype.Employee");
    21             System.out.println(classType.getName());
    22             System.out.println(classType.getSuperclass().getName());
    23         } catch (ClassNotFoundException e) {
    24             e.printStackTrace();
    25         }*/
    26         
    27         //获取基本数据类型的Class对象
    28         //Class<?> classType = int.class;
    29         //System.out.println(classType.getName());
    30         //System.out.println(classType.getSuperclass().getName());//无父类null值无法获取getName()
    31         
    32         //通过基本数据类型的包装类来获取
    33         //对应的基本数据类型对应的Class对象
    34         //Class<?> classType=Double.TYPE;
    35         //System.out.println(classType.getName());
    36         //System.out.println(classType.getSuperclass().getName());
    37         
    38         Class<?> classType=Double.class;
    39         System.out.println(classType.getName());
    40         System.out.println(classType.getSuperclass().getName());
    41     }
    42 
    43 }
  • 相关阅读:
    解决win10家庭版打不开组策略gpedit.msc
    Centos7上安装配置Redis
    Typora配置图片自动上传到图床
    SSM静态资源访问不了问题
    SSM整合
    opencv基础学习 小知识--绘图+小实战训练
    opencv基础学习详细笔记【1】--读取并显示图片
    Scikit-Learn 源码研读 (第二期)基类的实现细节
    Scikit-Learn 源码研读 (第一期)项目结构介绍
    在Win10上搭建fastai课程环境
  • 原文地址:https://www.cnblogs.com/wzy330782/p/5448760.html
Copyright © 2011-2022 走看看