java反射基础学习

本文介绍了Java反射机制,它是Java程序在运行时动态获取类信息并调用对象方法的功能。主要内容包括反射的概念、核心功能,如判断运行时类型、创建实例、获取和调用方法、访问构造器和成员变量等。同时,文中还讨论了反射的优缺点,提醒开发者在使用时注意性能开销和安全限制。
摘要由CSDN通过智能技术生成

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

反射 (Reflection) 是 Java 的特征之一,它允许运行中的 Java 程序获取自身的信息,并且可以操作类或对象的内部属性。

在 Java 程序中许多对象在运行是都会出现两种类型:编译时类型和运行时类型。 编译时的类型由声明对象时实用的类型来决定,运行时的类型由实际赋值给对象的类型决定 。如:
Person p=new Student();
其中编译时类型为 Person,运行时类型为 Student

反射的核心是JVM在运行时才动态加载类或调用方法/访问属性,它不需要事先(写代码的时候或编译期)知道运行对象是谁.

java反射主要提供以下功能:
(1) 在运行时判断任意一个对象所属的类;
(2) 在运行时构造任意一个类的对象;
(3) 在运行时判断任意一个类所具有的成员变量和方法(通过反射可以调用 private方法);
(4) 在运行时调用任意一个对象的方法;
重点: 在运行时而不是在编译时
反射最重要的用途就是开发各种通用框架.

2.反射的基本应用
(1) 获得Class 对象的3种方法

        //1.通过Class类的静态方法forName
        Class<?> clazz = Class.forName("java.lang.Integer");
        System.out.println(clazz);

        //2.直接获取一个对象的class
        Class<?> clazz1 =  int.class;
        Class<?> clazz2 =  Integer.TYPE;

        //3.通过某个对象的 getClass() 方法
        Integer c = new Integer(5);
        Class<? extends Integer> clazz4 = c.getClass();

(2) 判断是否为某个类的实例
一般地,我们用 instanceof 关键字判断是否为某个类的实例,同时我们也可以借助反射中 Class 对象的 isInstanceof() 方法来判断是否为某个类的实例, 它是以native方法:

(3) 创建实例

       //1. 使用Class对象的 newInstance() 来创建Class对象对应的实例
        Class<?> clazz = Student.class;
        Object o = clazz.newInstance();
        System.out.println(o);

        //2. 先通过Class对象获取指定的Constructor对象,再调用Constructor对象
           //的newInstance()来创建实例,这种方法可以用指定的构造器构造类的实例
        Constructor<?> constructor = clazz.getConstructor(String.class);
        Object x = constructor.newInstance("小雨");
        System.out.println(x);

(4) 获取方法
获取某个Class对象的方法集合,主要有以下几个方法:

  • getDeclaredMethods 方法返回类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。
  • getDeclaredMethod 方法返回一个特定的方法,其中第一个参数为方法名称,后面的参数为方法的参数对应Class的对象。
  • getMethods 方法返回某个类的所有公用(public)方法,包括其继承类的公用方法。
  • getMethod 方法返回一个特定的方法,其中第一个参数为方法名称,后面的参数为方法的参数对应Class的对象。

(5) 获取构造器信息
主要是通过Class类的getConstructor方法得到Constructor类的一个实例,而Constructor类有一个newInstance方法可以创建一个对象实例,此方法可以根据传入的参数来调用对应的Constructor创建对象实例。

(6) 获取类的成员变量信息
主要有以下几个方法:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值