前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java反射机制

Java反射机制

原创
作者头像
ruochen
修改2021-11-24 13:53:27
5270
修改2021-11-24 13:53:27
举报

一、反射机制的概念

Java的反射(reflection)机制是指在程序的 运行状态 中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用任意一个对象的属性和方法。这种动态获取程序信息以及动态调用对象的功能称为Java语言的反射机制。反射被视为动态语言的关键。undefined ——百度百科

JVM有一个运行时数据区,这个运行时数据区分为方法区,堆区和栈区,我们能够通过反射机制获取的class信息就是存储在方法区中的,这里的Class信息是通过.java文件编译成.class文件,然后由类加载器装载运行时数据区时,在方法区中就会产生对应的Class实例。

我们可以通过 反射机制 从方法区中 获取相应的Class实例,然后就可以获取到对应类型的函数、属性、父类、接口等 Class 内部信息

,说反射机制就有点高大上了,说白了,就是能够让我们拿到Class内部信息的一种方式

反射机制的 原理就是直接读取存在方法区中的Class实例

,至于读取信息的步骤则是严格按照.class文件的格式来读取的,.class文件的读取可以参考【JVM】带你解读字节码

二、如何使用反射

先创建一个User类

代码语言:txt
复制
public class User implements Serializable {
代码语言:txt
复制
    private String name;
代码语言:txt
复制
    private Integer age;
代码语言:txt
复制
    public User() {
代码语言:txt
复制
    }
代码语言:txt
复制
    public User(String name, Integer age) {
代码语言:txt
复制
        this.name = name;
代码语言:txt
复制
        this.age = age;
代码语言:txt
复制
    }
代码语言:txt
复制
    @Override
代码语言:txt
复制
    public String toString() {
代码语言:txt
复制
        return "User{" +
代码语言:txt
复制
                "name='" + name + '\'' +
代码语言:txt
复制
                ", age=" + age +
代码语言:txt
复制
                '}';
代码语言:txt
复制
    }
代码语言:txt
复制
    public String getName() {
代码语言:txt
复制
        return name;
代码语言:txt
复制
    }
代码语言:txt
复制
    public void setName(String name) {
代码语言:txt
复制
        this.name = name;
代码语言:txt
复制
    }
代码语言:txt
复制
    public Integer getAge() {
代码语言:txt
复制
        return age;
代码语言:txt
复制
    }
代码语言:txt
复制
    public void setAge(Integer age) {
代码语言:txt
复制
        this.age = age;
代码语言:txt
复制
    }
代码语言:txt
复制
}

1.获取Class对象的方法

代码语言:txt
复制
        //1.类的静态属性class
代码语言:txt
复制
        Class userClass=User.class;
代码语言:txt
复制
        //2.Object类对象的getClass方法
代码语言:txt
复制
        User user=new User();
代码语言:txt
复制
        Class userClass1=user.getClass();
代码语言:txt
复制
        //3.Class类静态方法forName
代码语言:txt
复制
        Class userClass2=Class.forName("model.User");

2.获取Class对象信息

相关类: Class,Constructor,Field,Method

;其中Class代表的是类对象,Constructor-类的构造器对象,Field-类的属性对象,Method-类的方法对象

后面三个类的获取都需要通过Class类

代码语言:txt
复制
/**
代码语言:txt
复制
 * @author xxj
 * 反射机制测试
 */
public class ReflexDome {
    public static void main(String[] args) throws Exception{
        //类的静态属性class
        Class userClass=User.class;
        System.out.println("User");
        System.out.println("User的类加载器:"+userClass.getClassLoader());
        System.out.println("User的全限定名:"+userClass.getName());
        System.out.println("User的父类全限定名:"+userClass.getSuperclass());
        System.out.println("User是否是接口类型:"+userClass.isInterface());
        Class[] interfaces= userClass.getInterfaces();
        for (Class i:interfaces) {
            System.out.println("user的实现接口全限定名:"+i.getName());
        }
代码语言:txt
复制
        TypeVariable[] typeParam=userClass.getTypeParameters();
代码语言:txt
复制
        for (TypeVariable variable:typeParam) {
代码语言:txt
复制
            System.out.println("User的访问修饰符:"+variable.getName());
代码语言:txt
复制
        }
代码语言:txt
复制
        System.out.println("------------------Field");
代码语言:txt
复制
        Field[] fields=userClass.getFields();
代码语言:txt
复制
        for (Field i :fields) {
代码语言:txt
复制
            System.out.println("User的public字段信息:"+i);
代码语言:txt
复制
        }
代码语言:txt
复制
        Field[] privateFields=userClass.getDeclaredFields();
代码语言:txt
复制
        for (Field i:privateFields) {
代码语言:txt
复制
            System.out.println("User的private字段信息:"+i);
代码语言:txt
复制
        }
代码语言:txt
复制
        System.out.println("---------------Methods");
代码语言:txt
复制
        Method[] methods=userClass.getMethods();
代码语言:txt
复制
        for (Method i:methods ) {
代码语言:txt
复制
            System.out.println("User的方法信息:"+i);
代码语言:txt
复制
        }
代码语言:txt
复制
        System.out.println("---------------Constructor");
代码语言:txt
复制
        Constructor[] constructors= userClass.getConstructors();
代码语言:txt
复制
        for (Constructor i:constructors) {
代码语言:txt
复制
        //通过newInstance()方法,可以构造一个对象
代码语言:txt
复制
            System.out.println("User的构造方法:"+i);
代码语言:txt
复制
        }
代码语言:txt
复制
    }
代码语言:txt
复制
}

三、反射的应用

  1. 最常见的应用就是 ORM的数据库框架 了。像Hibernate,MyBatis这些数据框架,在通过JDBC获得的数据并不是我们所定义的JavaBean,而是以游标的形式表现的,这些框架就通过反射机制获取到JavaBean的类信息,再通过无参构造方法构造一个对象,在将循环得到每个字段通过set方法传入对象中,不断循环就可以得到一个list了
  2. servlet 。在tomcat中,会有一个web.xml文件,tomcat会先拿着客户端传来的请求地址去web.xml中寻找,通过web.xml可以找到配置好的Servlet的子类名称,然后在通过反射机制找到对应的Servlet的子类,然后创建一个实例对象,调用其中的方法

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
作者已关闭评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、反射机制的概念
  • 二、如何使用反射
    • 1.获取Class对象的方法
      • 2.获取Class对象信息
      • 三、反射的应用
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档