java基础学习:java中的反射

Java基础学习总结(95)——Java反射主要用来干什么? Java除了给我们提供在编译期得到类的各种信息之外,还通过反射让我们可以在运行期间得到类的各种信息。通过反射获取类的信息,得到类的信息之后,就可以获取以下相关内容: 首先放出一个Java类作为反射的研究对象,类的内容如下: public abstract class FatherObject implements Runnable{ public void doSomething( 阅读详情

一、什么是java反射

什么是 java 的反射?

说到反射,写这篇文章时,我突然想到了人的”反省“,反省是什么?吾一日三省吾身,一般就是反思自身,今天做了哪些对或错的事情。

java 的反射,我觉得有同样的思想。当然 java 反射要“反思”的是 java 程序在运行时类自己的信息,它获取的信息就是它自身类的详细信息。

类的哪些详细信息呢?比如类或对象的成员变量、方法等。然后可以对这些信息加以修改,从而调整 java 的运行逻辑。

java 反射 API 提供了非常丰富的工具集,反射 API 能够获取对象的变量,方法等成员,从而可以动态的操纵 java 代码程序。文章后面会介绍这些反射 API(反射相关的类)的一些用法。

为什么反射能得到 java 程序运行时类的信息呢?这就要从 java 的虚拟机 jvm 说起。

二、虚拟机jvm加载文件

Java虚拟机(Java Virtual Machine):用于执行编译后的 java 程序的虚拟容器。jvm 可以跨操作系统使用。

jvm 内部结构分为 3 部分:类加载器classload子系统、运行时数据区、执行引擎。

以 .java 结尾的文件是不能直接在 jvm 上运行,它必须通过 javac 编译为以 .class 为后缀结尾的字节码文件才能运行。

java 文件被编译为 .class 的文件后,java 文件中各种对象的信息就确定下来了,存在于 .class 文件里。通过 java 的反射就可以获取里面的信息。

三、反射原理简析

在上一小节简单了解了文件加载内容,就是 java 文件经过编译后变成 .class 文件,类的各种信息就存储在 .class 文件中了,所以反射才能获取到类的各种信息。

java 代码编译为字节码的 .class 类文件,那 .class 文件里都有什么格式是什么?

class 文件结构采用类似 c 语言的结构体来存储数据。

ClassFile {
    u4             magic;
    u2             minor_version;
    u2             major_version;
    u2             constant_pool_count;
    cp_info        constant_pool[constant_pool_count-1];
    u2             access_flags;
    u2             this_class;
    u2             super_class;
    u2             interfaces_count;
    u2             interfaces[interfaces_count];
    u2             fields_count;
    field_info     fields[fields_count];
    u2             methods_count;
    method_info    methods[methods_count];
    u2             attributes_count;
    attribute_info attributes[attributes_count];
}

它由 2 部分组成:无符号的数和表。所有的表都习惯以 _info 结尾。

无符号的数属于基本的数据类型,一 u1,u2,u4,u8 分别来表示 1 个字节,2 个字节,4 个字节和 8 个字节的无符号数,无符号数可以用来表示数字、索引引用、数量值。

表用于描述有层次关系的复合结构的数据,整个 class 文件本质就是一张表。

类的信息都存储在 .class 文件里,当把 .class 文件读入内存时,就会为之创建一个 Class 对象。

这里又涉及到虚拟机加载类的机制。周志明的 《深入理解java虚拟机》 里有一节讲类加载的内容,上面 class 文件结构也来自本书,可以好好看一看此书。

简单说:java 虚拟机把描述类的数据 class 文件加载到内存,并对数据进行效验、转换解析和初始化,最终形成可以被虚拟机直接使用的类型,这就是虚拟机的类加载机制。

在 java 语言里,类的加载和连接过程都是在程序运行期间完成的,虽然有性能开销,但是为 java 应用程序提供了高度的灵活性。比如反射就是发生在 java 运行时完成的。

在类加载阶段,虚拟机会在 java 堆中生成一个代表这个类的 java.lang.Class 对象,通过这个 Class 对象就可以访问到 jvm 中的这个类。

Class 类与 class 是不同,Class 是实实在在存在于 java.lang.Class 包中的一个类。

反射:获取 Class 类对象及其类内部成员信息(属性, 方法, 构造函数等)以及控制实例对象的能力

四、反射功能常用的类

在 java 中,要使用反射功能,主要用到下面 2 个类:

  1. java.lang.Class

  2. java.lang.reflect

  • java.lang.reflect.Constructor, 获取构造方法,Class 对象所表示类的构造方法
  • Java.lang.reflect.Field, 字段成员,Class 对象所表示的类的成员变量,通过它可以动态修改成员变量值,包含 private
  • Java.lang.reflect.Method,方法成员,Class 对象所表示的类的方法成员,通过它可以动态调用对象的方法
  • Java.lang.reflect.Modifier,对类和成员访问修饰符进行解码

五、反射功能的使用

5.1 获取 Class 类对象的方法

获取 class 类对象的方法,主要有 3 种:

Class.forName(类的全限定名)
类名.class
对象.getClass()

​ (三种获取 Class 对象的方法)

先举一个小例子来看看这 3 种获取 Class 对象的用法。

java v1.8

第一步:用 IDEA 新建 maven 项目,名字叫 JavaBasicDemos

目录如下:

JavabasicDemos
  |-.idea
  |-src
    |-main
    | |-java
    | |  |-org.example
    | |   |-Main.java
    | |-resource
    |-test

把上面的 org.example 改成 org.basicdemo。然后在 org.basicdemo 下新建 reflect/reflectdemo1.java,student.java 文件,目录如下:

第二步:编写 student.java 代码

package org.basicdemo.reflect;

public class student {
    private String name = "Tom";
    private int age;

    public  student(){}

    public student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    private void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

 第三步:编写 reflectdemo1.java

package org.basicdemo.reflect;

public class reflectdemo1 {
    public static void main(String[] args) {
        try {
            Class<?> stuclz1 = Class.forName("org.basicdemo.reflect.student");
            System.out.println("Class.forName: " + stuclz1);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

        student stu = new student();
        Class stuclz2 = stu.getClass();
        System.out.println("对象.getClass(): " + stuclz2);

        Class stuclz3 = student.class;
        System.out.println("类名.class: " + stuclz3);
    }
}

点击IDEA上运行程序的绿色三角形按钮,输出如下:

Class.forName: class org.basicdemo.reflect.student
对象.getClass(): class org.basicdemo.reflect.student
类名.class: class org.basicdemo.reflect.student

此demo完整详细代码在 github 上: reflect demo

其他一些常用写法:

Class<?> clazz = Class.forName("Student");
System.out.println(clazz);
// or
Class cls = Class.forName("Student");
System.out.println(cls);
// 以前最常用反射获取jdbc
Class.forName("com.mysql.jdbc.Driver.class").

Class 类的其它一些方法:

  • getName() - 获取完整的类名,包括包名
  • getSimpleName() - 获取类名,不包括包名
  • isInterface() - 判断 Class 对象是否表示一个接口
  • getInterfaces() - 表示 Class 对象所引用的类所实现的所有接口
  • isInstance() - 判断是否为某个类的实例

5.2 通过反射创建类实例方法

  1. newInstance() 方法,Class 对象提供的 newInstance() 方法,来创建 Class 对象对应类的实例
    Class<Student> clz = Studnt.class
    Student stu = clz.newInstance()
    // 或者
    Student stu = Student.class.newInstance()
    
    //==========
    Class<?> c = String.class;
    Object str = c.newInstance();

    2.通过 Class 对象的构造器

通过 Class 对象获取 Constructor,再调用 Constructor 对象的 newInstance() 方法来创建对象

// 获取构造方法 Integer(int)
Construct construct1 = Integer.class.getConstructor(int.class)
Integer n1 = construct1.newInstance(123) // 调用构造方法
System.out.println(n1);

// 获取构造方法 Integer(String)
Constructor construct2 = Integer.class.getConstructor(String.class);
Integer n2 = (Integer) construct2.newInstance("567");
System.out.println(n2);

两种方法区别:

newInstance() 的局限是,它只能调用该类的 public 无参数构造方法。如果构造方法带有参数,或者不是 public,就无法直接通过Class.newInstance() 来调用。

为了调用任意的构造方法,反射 API 提供了 Constructor 对象,它包含一个构造方法的所有信息,可以创建一个实例。

5.3 反射获取构造方法

通过反射来获取构造方法,然后使用。

java 反射里的 Constructor 类,Class Constructor ,这个 Constructor 类表示的是 Class 对象所表示的类的构造方法。

java.lang.Object
     java.lang.reflect.AccessibleObject
          java.lang.reflect.Executable
               java.lang.reflect.Constructor<T>

 

通过 Class 类来获取类的构造方法主要有 4 个,分别为获取单个构造方法和获取多个构造方法。

  • 方法如下:
方法使用说明
public Constructor<?>[] getConstructors()返回所有public权限的构造函数的对象数组。
public Constructor<?>[] getDeclaredConstructors()获取所有构造函数方法,包括所有权限public,private,protected,default权限。
public Constructor getConstructor(Class<?>... parameterTypes)获取单个public权限的构造方法。
public Constructor getDeclaredConstructor(Class<?>... parameterTypes)获取单个构造方法,包括所有权限public,private,protected,default权限。
  • 调用构造方法:

newInstance(Object... initargs) ,使用此 Constructor 对象表示的构造方法,用它来创建类的新实例,并用指定的初始化参数初始化该实例。上面也有讲到过该方法使用。

写一个 demo 例子:

此demo完整详细代码在 github 上: github-reflect construct ,下面说说编写代码步骤。

第一步:新建一个 reflectconstructor 包,然后新建 2 个 java 文件,reflectconstructdemo1.java 和 student.java,如下图

第二步:把上一小节的 student.java 代码复制过来,然后增加几个构造函数

student(String name) {
   System.out.println("(student)private construct-age: "+age);
}
    
public student(){
    System.out.println("no args");
}

public student(String name, int age) {
    this.name = name;
    this.age = age;
}

private student(int age) {
    System.out.println("private construct-age: "+age);
}

 

第三步:在 reflectconstructdemo1.java 里编写获取构造函数方法

首先获取 Class 对象:

Class stuclz = Class.forName("org.basicdemo.reflectconstructor.student");
获取所有公有构造函数方法 getConstructors()

// 获取所有公有(public)构造方法
System.out.println("===========获取所有公有构造方法=========");
Constructor[] consarr = stuclz.getConstructors();
for(Constructor c : consarr) {
    System.out.println(c);
}
获取所有的构造函数方法 getDeclaredConstructors()

// 获取所有(public,protected,private,default)的构造方法
System.out.println("===========获取所有的构造方法=========");
Constructor[] consall = stuclz.getDeclaredConstructors();
for(Constructor c : consall) {
    System.out.println(c);
}

 

 获取单个构造函数方法(公有、无参的方法)

// 获取单个构造方法,公有无参的构造方法
System.out.println("===========获取单个公有、无参数的构造方法=========");
try {
    Constructor con = stuclz.getConstructor(null);
    System.out.println("con: " + con);
} catch (NoSuchMethodException e) {
    e.printStackTrace();
}

 

 获取单个私有private构造方法

System.out.println("===========获取单个私有private构造方法=========");
Constructor con = stuclz.getDeclaredConstructor(int.class);
System.out.println(con);
// 调用设置能访问
con.setAccessible(true); // 因为是私有,所以必须设置能访问
// 创建 student 对象
student stu = (student) con.newInstance(12);
stu.setAge(13);
System.out.println("age: "+stu.getAge());

5.4 获取成员字段 Field

通过 Class 类提供的方法来获取成员字段信息,主要方法有 4 种,也分为获取单个和多个成员,是公有还是私有,还是所有权限都能获取。

  • 方法如下:
方法使用说明
public Field getField(String name)根据名字获取单个public权限的字段
public Field getDeclaredField (String name)根据名字获取某个字段,字段权限可以是所有,包括private
public Field[] getFields ()获取所有public权限字段
public Field[] getDeclaredFields ()获取所有字段,字段权限可以是所有,包括private
  • 写一个 demo 例子

第一步:创建一个 reflectfield 的包,然后新建 2 个 java 文件,reflectfielddemo1.java 和 student.java,如下图

第二步:把上一小节 reflectconstructor 包里的 student 类代码复制到这里的 student.java 里,然后添加几个字段

public String address;

public int grade;

protected String email;

String phone;

第三步:编写获取字段的方法

获取 Class 对象

// 获取 Class 对象
Class stuClz = Class.forName("org.basicdemo.reflectfield.student");

获取所有字段的方法

// 获取所有 public 权限的字段
System.out.println("==========获取所有 public 权限的字段===========");
Field[] fieldArr = stuClz.getFields();
for(Field f : fieldArr) {
    System.out.println(f+" - ("+f.getDeclaringClass() +") - ("+f.getName()+":"+f.getType()+")");
}

// 获取所有权限的字段,包括private
System.out.println("==========获取所有权限的字段,包括private===========");
Field[] fieldsArr = stuClz.getDeclaredFields();
for(Field f : fieldsArr) {
    System.out.println(f);
}

获取单个字段方法

// 根据名字获取单个public字段
System.out.println("===========根据名字获取public字段============");
Field addressField = stuClz.getField("address");
System.out.println(addressField);
// 根据反射来设置下这个字段
Object obj = stuClz.getConstructor().newInstance();
// 用 set 方法来设置字段的值
addressField.set(obj, "setTestValue");
// 打印设置的值
student stu = (student) obj;
System.out.println("print address value: " + stu.address);

// 根据名字获取某个字段,字段权限包括所有,也包括private
System.out.println("=========根据名字获取某个字段,字段权限包括所有,也包括private=======");
// 来获取一个 private 字段
Field nameField = stuClz.getDeclaredField("name");
System.out.println(nameField);
// 没有设置前的name值
System.out.println("name value before setting: "+stu.getName());
// 来设置值
nameField.setAccessible(true); // 因为是private,所以先要设置可访问。相当于打开一个开关,原本是不可以写的。
nameField.set(obj, "jimmy");
System.out.println("name value after setting: " + stu.getName());

 IDEA 上代码运行输出:

==========获取所有 public 权限的字段===========
public java.lang.String org.basicdemo.reflectfield.student.address - (class org.basicdemo.reflectfield.student) - (address:class java.lang.String)
public int org.basicdemo.reflectfield.student.grade - (class org.basicdemo.reflectfield.student) - (grade:int)
==========获取所有权限的字段,包括private===========
private java.lang.String org.basicdemo.reflectfield.student.name
private int org.basicdemo.reflectfield.student.age
public java.lang.String org.basicdemo.reflectfield.student.address
public int org.basicdemo.reflectfield.student.grade
protected java.lang.String org.basicdemo.reflectfield.student.email
java.lang.String org.basicdemo.reflectfield.student.phone
===========根据名字获取public字段============
public java.lang.String org.basicdemo.reflectfield.student.address
no args
print address value: setTestValue
=========根据名字获取某个字段,字段权限包括所有,也包括private=======
private java.lang.String org.basicdemo.reflectfield.student.name
name value before setting: Tom
print name value after setting: jimmy

 

  • 关于 Field 的一些其他常用操作方法:
方法名使用说明
Object get(Object obj)返回指定对象上字段值
void set(Object obj, Object value)指定对象上为field字段设置新值
Class<?> getType()field字段表示的声明的字段类型
Class<?> getDeclaringClass()field字段所在类的Class对象
String getName()返回字段名称
void setAccessible(boolean flag)对象的 accessible 标志设置,可以设置字段的访问性。比如设置为true表示其可写

5.5 获取成员方法 Method

通过 Class 类获取 Method 对象的方法,与上面获取字段field方法相似,也有 4 种,分为获取单个和获取多个方法。

方法使用说明
public Method[] getMethods ()获取所有public的方法,包含父类的方法
public Method getDeclaredMethod (String name, Class<?> ...parameterTypes)获取所有的方法,包括private
public Method getMethod (String name, Class<?>... parameterTypes)获取单个public的方法
public Method getDeclaredMethod (String name, Class<?>... parameterTypes)根据名字获取所有的方法
  • demo 例子

第一步:与上一小节filed一样,先新建一个 reflectmethod 包,然后在里面新建 2 个 java 文件,reflectmethoddemo1.java 和 student.java,如下图:

第二步:把上一小节的 student.java 代码复制到这里

并增加一个基础 student.java 的class TomStudent,

class TomStudent extends student {
    private void printName() {
        System.out.println("a student name: Tom");
    }

    public int getTomAge() {
        return 12;
    }

    public void setTomeAge(int age) {
        this.setAge(age);
    }
}

  

第三步:编写获取方法的代码

获取多个的方法

// 获取所有public method方法
System.out.println("=============获取所有public method方法,包括继承父类的===============");
Method[] methodArr = stuClz.getMethods();
for(Method m:methodArr) {
    System.out.println(m); // 不仅打印出了 TomStudent 所有 public 方法,它继承的方法也打印出来
}

获取单个的方法:

// 根据参数获取public的方法,包含继承自父类的方法
System.out.println("=======根据参数获取public的方法,包含继承自父类的方法======");
Method method = stuClz.getMethod("setAge", int.class);
System.out.println(method);
  • 方法调用 invoke
    // 根据参数获取public的方法,包含继承自父类的方法
    System.out.println("=======根据参数获取public的方法,包含继承自父类的方法======");
    Method method = stuClz.getMethod("setAge", int.class);
    System.out.println(method);
    // 反射调用方法
    Object obj = stuClz.newInstance();
    method.invoke(obj, 12);
    student stu = (student)obj;
    System.out.println(stu.getAge());

 如果是调用private方法,一定要设置 setAccessible(true) 。

六、反射有哪些用途

  • 动态代理 :动态代理可以通过反射来实现。
  • 注解 :注解也是用反射来实现。注解利用反射机制来调用注解的解释器。
  • 开发框架 :比如 Spring 框架。Spring 中的 XML 配置 Bean 等。

等用途。

基于LabVIEW控制仪器检测与监控 --普源示波器DS1102Z-E LabVIEW 控制普源示波器 代码实现与解释 阅读详情

相关推荐

【Qt笔记】1.VSCode搭建Qt运行环境

Qt6之后已经抛弃qmake,使用cmake。cmake相对qmake来说只有优点没有缺点。使用VSCode搭建完Qt的运行环境就能开开心心debug了.vscode需要使用的插件:2.Qt tools3.CMakec++插件可以不关注,缺啥都会提醒你.正常安装即可。

没有手牌的博客 2万+

Java 反射机制介绍

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。Java反射机制在框架设计中极为广泛,需要深入理解 反射基础 RRIT(Run-Time Type Identification)运行时类型识别。在《Thinking in Java》一书第十四章中有提到,其作用是在运行时识别一个对象的类型和类的信息。主要有两种方式:一种是“传统的”RTTI,它假定

vincent_wen0766的博客 785

什么是深度展开网络?如何将迭代算法的每一次迭代展开成深度网络对应的一层?深度展开网络进行端对端训练,其中端对端是什么意思?

在深度学习和机器学习的背景下,“端到端”(End-to-end)训练指的是将输入数据直接映射到最终输出的过程,而不需要任何中间的手动数据预处理或特征工程。- **自然语言处理**:端到端自然语言处理系统可以将自然语言输入直接转化为计算机可理解的语言输出,而不需要对语言进行分解和转化。- **推荐系统**:通过使用深度神经网络,端到端推荐系统可以直接根据用户历史行为预测其未来的兴趣爱好,并推荐相应的产品或服务。4. **直接映射**:从输入到输出的直接映射,中间没有任何拆分或分解的过程。

m0_67897882的博客 5433

学会反射后,我被录取了(干货)

反射是一个非常重要的知识点,在学习Spring 框架时,Bean的初始化用到了反射,在破坏单例模式时也用到了反射,在获取标注的注解时也会用到反射······当然了,反射在日常开发中,我们...

公众号:Java后端 381

eMMC FFU固件更新实战:从协议解析到设备修复

本文详细解析eMMC FFU固件更新技术,从协议原理到实战操作,涵盖EXT_CSD寄存器操作、命令流状态机解析及专业工具使用指南。通过真实维修案例,展示如何利用FFU机制修复设备故障,并提供高级优化技巧与安全注意事项,是硬件工程师和维修技术人员的实用参考。

weixin_29191761的博客 378

(实测可用)STM32L431RCT6开发板-实验1 跑马灯实验

一、开发板平台简介: 1、开发板资源简介 (1)开发板主芯片型号:STM32L431RCT6 (2)开发板主芯片封装:LQFP-64_10x10x05P (3)开发板主芯片内核:ARM® Cortex®-M4 (4)开发板主芯片主频:80MHz (5)开发板主芯片Flash大小:256KB (6)开发板主芯片RAM大小:64KB

zhej2014的博客 3167

一起学JAVA 反射学习(超详细)

一起学JAVA 反射学习(超详细)

weixin_58276266的博客 390

PMP--二模--解题--161-170

A:邀请团队成员在下一次回顾中分享经验。B:请求发起人增加具有所需经验的团队成员。C:在团队内计划知识共享会议。D:请求发起人为团队提供培训课程。A。

stqer的博客 1270

Java反射(简单详细且易懂,快速入门)

Java反射是Java语言的一种特性,它允许程序在运行时自我检查并对内部成员进行操作。这种动态获取信息以及动态调用对象方法的功能称为Java语言的反射机制。具体来说,反射机制允许在运行状态中对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性,并且能改变它的属性。Java反射机制的核心是在程序运行时动态加载类并获取类的详细信息,从而操作类或对象的属性和方法。其本质是JVM得到Class对象之后,再通过Class对象进行反编译,从而获取对象的各种信息。

qq_64997449的博客 1万+

DeerFlow 系列教程 第二十篇 | 前端定制与二次开发指南

支持的语言定义在locale.tsLocale 检测采用三级降级策略Cookie 优先:检查localeCookie浏览器语言默认值en-US.value;if (locale!DeerFlow 使用管理主题切换,在根布局中通过主题相关的 CSS 变量定义在中(约 10KB)。: boolean;// 是否支持深度思考。

weixin_43674738的博客 223

Agent应用实践之三 - 基础:AgentScope-ReActAgent源码解析

本章通过总结AgentScope的核心类,再通过分析ReActAgent调用大模型的底层源码原理。使我们基本了解了Agent的基本原理,这个实现方式与OpenClaw使用pi-mono的Agent基础框架是一致的。了解完ReActAgent的基本原理,下一章我们会将一下SpringBoot集成方式的代码原理,这两章是我们构建后续内容的基本框架。

代码让AI扣 470

【Java学习笔记】基础加强之反射

本文是在学习了刘意老师的Java基础视频之后,写出的学习笔记。 1.类的加载 当程序要使用某个类时,如果该类还没有被加载到内存中,则系统会通过加载,连接,初始化三步来实现对这个类进行初始化。 2.类加载器 负责将.class文件加载到内存中,并为之生成对应的Class对象。 3.反射 通过class文件对象,使用该文件中的成员变量、构造方法、成员方法。 4.反射的原理 首先需要把j...

我们仨 209

【C语言】一文搞懂C语言文件操作

读写文件、文件相关库函数详解、文件缓冲区介绍

StackFrame 5660

java反射基础学习

什么是反射? JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。 package com.zxwy.learn.bean; public interface IEat { public void eat(String food); } package com.zxwy.learn.bean; public class Person

weixin_52188374的博客 1414

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

JAVA基础学习笔记-day17-反射

Reflection(反射)是被视为动态语言的关键,反射机制允许程序在运行期间借助于Reflection API取得任何类的内部信息,并能直接操作任意对象的内部属性及方法。加载完类之后,在堆内存的方法区中就产生了一个Class类型的对象(一个类只有一个Class对象),这个对象就包含了完整的类的结构信息。我们可以通过这个对象看到类的结构。这个对象就像一面镜子,透过这个镜子看到类的结构,所以,我们形象的称之为:反射。

天才在左,疯子在右,而我只想做个不折不扣的乐天派 1170

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Java基础学习之反射

Java基础学习Java基础学习之反射正射反射的思想反射的基本使用获取类Class对象构造类的实例化对象获取一个类的所有信息获取注解反射的应用场景Spring的IOC容器反射+抽象工厂模式JDBC加在数据库驱动类反射的优势及缺陷增加程序的灵活性破坏类的封装性性能损耗反射总结参考文章 Java基础学习之反射 反射是java中非常重要的知识点,无论是Bean的初始化还是获取标注的注解也可以用到反射,在日常开发中不会直接使用反射,但是我们在开发项目的时候基本每刻都在使用反射。 本文中会先介绍反射的思想、基本使用、

ghw15221836342的博客 603

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Java反射基础学习总结

一、反射的概述 什么是反射 Reflection(反射)是Java被视为动态语言的关键,反射机制允许程序在执行期间借助Reflection API取得任何类的内部信息,并能直接操作任意对象的内部属性及方法。 反射就是把java类中的各种成分映射成一个个的Java对象 加载完类之后,在堆内的方法区中就产生了一个Class类型的对象,这个对象就包含了完整的类的结构信息。我们可以通过这个对象看到类的结构,例如:一个类里有成员变量,方法,包等信息,通过反射可以把类中的个个组成信息映射为对象。 注:一个类在内存中只有

weixin_46078499的博客 395

【Java 反射学习】Java 反射基础

知识点 类是用来描述对象的,而反射就可以理解为是用来描述类的。 类中的属性包括: Class 类本身 Package 类所在的包 Field 类中的属性 Method 类中的方法 Constructor 类中的构造方法 Annotation 类中的注解 如何获取Class 1.Class的静态方法,forName("全类名") 2.类.class关键字 3.对象引用.getClass...

a37432724的博客 137

反射第一篇,学习Java的反射基础

反射基础什么是反射?反射的使用介绍:类对象获取类对象类对象的方法简介使用:利用反射创建对象例使用:获取成员变量并修改例使用:获取成员方法并调用例参考地址 什么是反射? 反射就是把Java类中的各个成分映射成一个个的Java对象。 即在运行状态中,对于任意一个类,都能够知道这个类的所以属性和方法; 对于任意一个对象,都能调用它的任意一个方法和属性。 这种动态获取信息及动态调用对象方法的功能叫Java的反射机制。 反射可以做什么? 运行时, 判断任意一个对象所属类 获得任意一个类的对象、成员变量、方法、构造器、

嗯... 639

Java基础学习:反射篇

1.什么是反射?   Reflection(反射)是被视为动态语言的关键,反射机制允许程序做执行期间借助于ReflectionAPI取得任何类的内部信息,并能直接操作任意对象内部属性及方法 2.反射相关的主要API java.lang.Class:代表一个类   java.lang.reflect.Method:代表类的方法   java.lang.reflect....

150

Java学习【阶段一[12】基础加强(02 反射)

qq_41915980的博客 128

Java基础学习笔记——反射

反射 各种配置文件其实就是一些参数信息 class Class{ //... } Class类:大写开头的Class类将java中的.class字节码文件也给看成了一个类 想要对一个类进行解剖,只要获取到该类的字节码文件对象即可 1. 获取字节码文件对应对象3种方法 Object 类中的getClass()方法 比如p1和p2是同一个类的两个不同的实例,二者的getClass()方法返...

qq_43420530的博客 212

Java反射基础学习笔记

Java反射要学习哪些内容,其实要知道的东西很少,也很简单掌握。主要如下:第一部分就是要理解什么是反射。只需要知道反射可以获取类的全部信息,其主要也是用来获取类的全部信息。第二就是会使用反射。包括如何获取反射类、构造函数、成员变量、成员函数、注解等,以及一些常用方法的使用。

qq_36722262的博客 1195

Java学习反射之基础

今天小编学习了Java里比较核心的反射原理,明白了反射是Java非常突出的一个动态相关机制。 解释一下,反射机制是Java在运行状态中,对于于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制,很多优秀的开源框架都是通过反射完成的。理解了反射,就是成为大神的第一步! public class Simple { public static void main(String[] args

人在江湖飘,哪能不挨刀 170

java反射中的T_新手学习java反射基础

一、反射反射:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。要想解剖一个类,必须先要获取到该类的字节码文件对象。而解剖使用的就是Class类中的方法.所以先要获取到每一个字节码文件对应的Class类型的对象。对于反射的操作实际上就是通过C...

weixin_42287030的博客 393
上一篇: Java常用类的使用
下一篇: Spring5源码14-SpringMVC-HandlerMapping
java_lujj
博客等级 码龄4年 18粉丝 152原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值