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 }
  • 相关阅读:
    HTB-靶机-Charon
    第一篇Active Directory疑难解答概述(1)
    Outlook Web App 客户端超时设置
    【Troubleshooting Case】Exchange Server 组件状态应用排错?
    【Troubleshooting Case】Unable to delete Exchange database?
    Exchange Server 2007的即将生命周期,您的计划是?
    "the hypervisor is not running" 故障
    Exchange 2016 体系结构
    USB PE
    10 months then free? 10个月,然后自由
  • 原文地址:https://www.cnblogs.com/wzy330782/p/5448760.html
Copyright © 2011-2022 走看看