• 一、反射机制介绍_Class 对象获取


    一、反射机制是 Java 的动态性之一

    动态语言:在程序运行时,可以改变程序的结构或变量的
    类型。

    举例:JavaScript

    运行结果;

    典型的动态语言”Python、ruby、JavaScrip C,C++。

    Java 不是动态语言,但具有一定的动态性,可以 称为”准动态语言”,具备类似动态语言的特性。

    传一块代码来动态的执行,动态的处理,Java 也能做,可以利用反射来实现类似的功能。

    Java 的动态性让编程变得更加的灵活,功能就更加的强大。

    二、 反射机制

    程序在运行的过程中加载一些“只知道相关名字”的类, 以下代码,在程序运行时加载 User 类。

    Classc=Class.forName("com.bjsxt.reflect.User");

    一个类被加载后,JVM 会创建一个对应类的 Class 对象, 类的整个结构信息会被放到 Class 对象中。

    这个 Class 对象就像镜子一样,通过这面镜子,可以得到对应类的全部信息。

    三、 反射机制的常见作用

    1) 动态的加载类、动态的获取类的信息(属性,方法,构造 器)

    2) 动态构造对象

    3) 动态调用类和对象的任意方法、构造器

    4) 动态调用和处理属性

    5) 获取泛型信息

    6) 处理注解

    四、 获取 Class 对象的方式

    1) 通过字节码文件

    2) 对象的 getClass()方法
    3) Class 类的静态方法 forName(….)

     1 package com.bjsxt.entity;
     2 
     3 public class User {
     4     //类的属性
     5     private int userId;
     6     private String userName;
     7     private String password;
     8     //公有的取值,赋值方法
     9     public int getUserId() {
    10         return userId;
    11     }
    12     public void setUserId(int userId) {
    13         this.userId = userId;
    14     }
    15     public String getUserName() {
    16         return userName;
    17     }
    18     public void setUserName(String userName) {
    19         this.userName = userName;
    20     }
    21     public String getPassword() {
    22         return password;
    23     }
    24     public void setPassword(String password) {
    25         this.password = password;
    26     }
    27     //构造方法
    28     public User() {
    29         // TODO Auto-generated constructor stub
    30     }
    31     public User(int userId, String userName, String password) {
    32         super();
    33         this.userId = userId;
    34         this.userName = userName;
    35         this.password = password;
    36     }
    37     
    38     
    39 }
     1 public class Test {
     2     public static void main(String[] args) throws ClassNotFoundException {
     3         System.out.println(int.class);
     4         System.out.println(void.class);
     5         int []arrA=new int[10];
     6         int[] arrB=new int[30];
     7         /**维数相同和类型相同的数组共享同一个Class对象*/
     8         System.out.println(arrA.getClass()==arrB.getClass());
     9         
    10         /**同一个类的N多对象,共享同一个Class对象*/
    11         User u1=new User();
    12         User u2=new User();
    13         System.out.println(u1.getClass()==u2.getClass());
    14         
    15         
    16         /**获取Class对象的三种方式*/
    17         //(1)通过对象的getClass()方法获取
    18         Class c1=u1.getClass();
    19         //(2)通过字节码文件获取
    20         Class c2=User.class;
    21         //(3)通过Class类的静态方法获取
    22         Class c3=Class.forName("com.bjsxt.entity.User");
    23         
    24         System.out.println((c1==c2)+"	"+(c1==c3));
    25         
    26         
    27     }
    28 }

  • 相关阅读:
    UIView
    UISwitch
    UIButton
    label标签的属性
    sublime 生成网页头文件
    Xcode快捷键
    Bootstrap 模态对话框只加载一次 remote 数据的解决办法 转载
    用谷歌浏览器来当手机模拟器
    DDD:谈谈数据模型、领域模型、视图模型和命令模型
    MoQ(基于.net3.5,c#3.0的mock框架)简单介绍
  • 原文地址:https://www.cnblogs.com/qiaoxin11/p/12706080.html
Copyright © 2020-2023  润新知