Java基础-反射基础

Java基础之反射 本文主要讲述反射的原理和用法提示:以下是本篇文章正文内容,下面案例可供参考Java的反射是在我们的某一个类在运行的过程中可以动态的获取类的属性,构造方法,方法,父类,接口等内部的信息机制。反射的本质就是反着来。我们new一个对象的时候,实际上是由Java虚拟机根据Class类对象在运行的时候构建出来的。反射通过Class类对象获取类定义的信息(有属性,成员方法,构造方法等)。换句话说:就是换一种方式获取类对象的属性,方法,父类,接口等信息。 阅读详情

一、基础概念

反射机制:在运行状态中,对于任意一个类都能够在知道这个类的全限定名的情况下获取这个类的构造方法、属性和方法,并且对于任意一个对象,都能够调用它的任意方法,这种动态获取信息以及动态调用对象方法的功能称之为Java语言的反射机制。

二、反射设计相关的类

java.lang.Class:反射核心类,可以获取类的构造方法(私有和公有的)
java.lang.Constructor:表示类的构造方法,可以用来返回对象的实例
java.lang.reflect.Field:保存类的成员变量,可以用来获取和设置类之中的属性值
java.lang.reflect.Method:表示类的方法,可以用来获取类中的方法信息,或执行方法
package Reflect;

/**
 * Created by luckyboy on 2018/8/6.
 */
public class Person {
    private int age;
    private String name;

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

    public int getAge() {
        return age;
    }

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

    private String getName() {
        return name;
    }

    private void setName(String name) {
        this.name = name;
    }
    public String toString(){
        return "Person:["+this.name+" "+ this.age+"]";
    }
}

使用Class类获取Person类的构造方法、实例域、一般方法

package Reflect;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
 * Created by luckyboy on 2018/8/7.
 */
public class ReflectTest2 {
    public static void main(String[] args){
        try {
            Class clazz = Class.forName("Reflect.Person");
            Field[] fields = clazz.getFields();
            Constructor[] constructors = clazz.getConstructors();
            Method[] methods = clazz.getMethods();
            printArray(fields);
            System.out.println("--------------");
            printArray(methods);
            System.out.println("--------------");
            printArray(constructors);

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
    private static void printArray(Object[] objects){
        for(Object o:objects){
            System.out.println(o.toString());
        }
    }
}

输出结果

public java.lang.String Reflect.Person.toString()
public void Reflect.Person.setAge(int)
public int Reflect.Person.getAge()
public final void java.lang.Object.wait() throws java.lang.InterruptedException
public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
public boolean java.lang.Object.equals(java.lang.Object)
public native int java.lang.Object.hashCode()
public final native java.lang.Class java.lang.Object.getClass()
public final native void java.lang.Object.notify()
public final native void java.lang.Object.notifyAll()
--------------
public Reflect.Person(int,java.lang.String)
public Reflect.Person(int)

从以上结果我们可以看出,

  • 获取类的方法时会获取到从父类继承下来的构造方法。
  • 对于一个类的私有方法和私有构造方法通过这种方法是获取不到的。
  • 那么如果我们要获取一个对象的私有构造方法应该通过设置Constructor.setAccessible(true)的方法获取。

三、反射获取类实例对象

Class.newInstance()                                             //通过类的无参构造方法获取类的实例对象
Constructor<T> getConstructor(Class ...parameterTypes)          //获取类的构造器,通过指定参数类型
Constructor<T> getDeclaredConstructor(Class...parameterTypes)   //获取类的构造器,通过指定参数类型

使用反射机制获取类的对象实例步骤

  • 使用Class.forName(类的全限定名)获取Class对象
  • 使用Class.newInstance()或者是Constructor.newInstance()方法获取类的对象实例
package Reflect;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

public class ReflectTest1 {
    public static void main(String[] args){
        try {
            Class clazz = Class.forName("Reflect.Person");

            //方法一:使用newInstance()的方法获取对象实例
            Person person = (Person)clazz.newInstance();
            person.setAge(23);
            person.setName("Markliwei");
            System.out.println(person.toString());

            System.out.println("----------------------");
            //方式二:使用构造器Class.getDeclaredConstructor()+Constructor.newInstance()方式获取对象
            Constructor constructor = clazz.getDeclaredConstructor(int.class,String.class);
            Person person1 = (Person) constructor.newInstance(25,"Jide");
            System.out.println(person1.toString());

            System.out.println("----------------------");
            //方式三:使用Class.getConstructor()+Constructor.newInstance()方式获取对象
            Constructor cosntructor1 = clazz.getConstructor(int.class,String.class);
            Person person2 = (Person) constructor.newInstance(23,"Xianyu");
            System.out.println(person2.toString());

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
    }
}

输出结果

Person:[Markliwei 23]
----------------------
Person:[Jide 25]
----------------------
Person:[Xianyu 23]

四、使用反射机制破坏单例设计模式

Singletone是一个单例类,因此通常我们只能使用静态的方法来构造一个对象。

package Reflect;

public class Singletone {
    private static Singletone instance = new Singletone();
    private Singletone(){};
    public static Singletone getInstance(){
        return instance;
    }
}

现在我们通过反射的方式获取对象的私有构造方法,然后构造对象。

package Reflect;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;


public class DestroySingletone {
    public static void main(String[] args){
        Singletone singletone1 = Singletone.getInstance();
        Singletone singletone2 = Singletone.getInstance();
        System.out.println("singletone1 == singletone2 : "+(singletone1 == singletone2));
        try {
            Class clazz = Class.forName("Reflect.Singletone");
            Constructor constructor = clazz.getDeclaredConstructor();
            constructor.setAccessible(true);//一定要设置这个构造器时可访问的
            Singletone singletone3 = (Singletone) constructor.newInstance();

            System.out.println("singletone1 == singletone3 : "+(singletone1 == singletone3));
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
    }
}

输出结果

singletone1 == singletone2 : true
singletone1 == singletone3 : false

这里我们需要注意就像前面提到过的一样,我们无法获取对象的私有构造方法,这个时候我们只能通过设置Constructor.setAccessible(true)的方式设置构造器是可访问的。

参考文章

https://blog.youkuaiyun.com/xu__cg/article/details/52877573

Cadence OrCAD Capture CIS元器件管理时ERROR(ORCIS-6454): Temporary part number tracking is turned on报错的解决方法 使用Part manager对工程的元器件进行批量管理时,出现如下图所示的ERROR(ORCIS-6454): Temporary part number tracking is turned on报错其解决方法如下。 阅读详情

相关推荐

KEPServerEX中,别名映射(Alias Mapping)数据标签重命名机制

目录核心机制应用场景配置步骤技术特性与参考内容的差异KEPServerEX中,别名映射(Alias Mapping) 是一种数据标签重命名机制,主要用于简化复杂标签路径的调用或实现跨系统兼容。其核心逻辑和功能如下:路径抽象 将设备层级结构中的完整标签路径(如 Channel1.Device1.Tag1)映射为简短别名(如 TempSensor1),降低客户端调用的复杂度。动态绑定 别名与实际标签实时关联,数据更新和读写操作通过别名直接传递到底层物理标签,无需修改客户端配置。多对一映射支持多个别名指向

「东哥说MES」 专注于MES制造执行系统,为你拆解核心架构、功能模块及与ERP/PLC的集成逻辑。提供从入门到精通的系列干货、精选行业报告与实用工具,构建你的数字化知识体系,关注我,用实战经验照亮你的数字化之路。 1591

Java 基础 - 反射

类的对象:基于某个类 new 出来的对象,也称为实例对象。类对象:类加载的产物,封装了一个类的所有信息(类名、父类、接口、属性、方法、构造方法、包) ,每个类只有一个类对象。反射:把Java类中的各种成分映射成单独的Java对象进行操作。注意:每个类加载到内存都会生成一个唯一的类对象。

哈哈哈哈丶昊的博客 946

第三篇:AMD 和 Intel

它像“乐高积木”一样,可以通过标准化的接口与其他部分组合,构建复杂系统。理解组件后,你会发现从操作系统到微服务,现代软件本质上都是组件的组合!

u013089100的博客 1031

Java-反射基础

在Java当中,万物皆对象class中用于获取构造方法的方法1.返回所有公共构造方法对象的数组2.返回所有构造方法对象的数组3.返回单个公共构造方法对象4.返回单个构造方法对象constructor类中用于创建对象的方法根据指定的构造方法创建对象设置为true,表示取消访问控制class类中用于获取成员变量的方法-》返回所有公共成员变量对象的数组-》返回所有成员变量对象的数组-》返回单个公共成员变量对象-》返回单个成员变量对象filed类中用于创建对象的方法-》赋值-》获取值。

luxury的博客 1652

miRNA测序数据生信分析——第一讲,总结概述

这里的miRNA测序指转录水平的测序。这里每一个数据库都可以在线访问,但是如果要本地使用,都需要进行数据库文件下载,整理。

weixin_44616693的博客 4953

Windows-Anaconda3+TensorFlow安装教程

测试环境:win10-64位和win7-64位 (系统必须是64位,因为TensorFlow目前只支持64位) 一、安装Anaconda3 1.下载Anaconda3 Anaconda官网链接:link 这里我们选择Windows版本,python3.6-version-64位,如下图所示。 2.下载完成之后,点击安装Anaconda3 注意:安装过程中要选择添加环境变量,如图 待安装完成...

DoctorCuiLab的博客 3086

Java基础—反射

Java语言对大小写是敏感的,所以Class和class是不同的,Class类也是类的一种,与class关键字不同.类被编译后会产生一个Class对象,作用是创建保存类的类型信息,并且这个Class对象保存在同名的.class文件中(字节码文件)通过class关键字标识的类,在内存中只有一个与之对应的Class对象来描述其类型信息,即使有多个对象,它们依据的都是同一个Class对象Class类只存在私有构造函数,所以只能被JVM创建和加载。

左灯右行的爱情 1030

LVGL 丝滑菜单3(Silk Menu)

h。

摸鱼专家 91

java反射基础知识总结

java反射基础知识总结

笔杆__的博客 339

matlab 显示曲面网格【2025最新版】

matlab点云工具箱对点云三维重建结果显示的函数。博客长期更新,本文最近更新时间为:2025年9月14日。

点云侠的博客 2581

在时间轴上联动多张内表:ABAP 的 PROVIDE ... ENDPROVIDE 区间联动迭代实战

PROVIDE 是 ABAP 中处理有效期区间数据的强大工具,它能自动将多张内表按时间维度切片并联合处理。其核心功能包括:指定区间边界字段(BOUNDS),定义外部总区间(BETWEEN),并通过工作区和标志位(VALID)标识每张表在当前子区间是否生效。该语法特别适合 HR 信息类型等有效期数据,能避免手动处理区间重叠、排序和空档等问题。使用时需注意字段投影(FIELDS)限制、工作区只读原则,以及异常处理(如区间重叠或未排序)。典型应用场景包括员工调岗记录、价格有效期管理等需要时间轴联动的业务逻辑。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1671

Java 反射基础

Java反射(Reflection)是Java编程语言的一个特性,它允许在运行时对类、接口、字段和方法进行动态查询和操作。反射提供了一种在运行时查看和修改程序行为的能力,这通常用于实现一些高级功能,如框架、ORM(对象关系映射)工具、IDE(集成开发环境)等。

TGO-Ming 883

YOLOv11改进策略【小目标改进】| 添加专用于小目标的检测层 附YOLOv1~YOLOv11的检测头变化详解

在目标检测领域,小目标检测一直是一个具有挑战性的问题。算法以其高效快速的特点受到广泛关注,然而在面对小目标时,仍存在一些局限性。本文将介绍如何在中添加小目标检测层,以提高对小目标的检测能力。原始模型结构如下:详细内容参考:YOLOv11原始模型结构介绍 二、有效特征层对应的检测头类别 2.1 P3/8 - small检测头 原始模型中的对应的检测头主要用于检测相对较小的目标。其特征图大小相对较大,空间分辨率较高。 适合检测尺寸大概在到像素左右的目标。 2.2 P4/16 - medium检测头 这个检

Limiiiing的博客 8800

Java基础之—反射(一)

Java基础之—反射(一) 概述: 1、介绍什么是反射 2、获得Class类对象的三种方式 一、什么是反射 描述得到数据结构的结构的数据的一种行为。 二、通过反射可以得到什么? 三、获得Class类对象的三种方式 public class ClassDemo { public static void main(String[] args) throws Exce...

Bruce小鬼 975

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Devexpress16.2.6破解工具

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

Java 基础之反射

反射快速入门 方向探知,在程序运行过程中动态的获取类的相关属性 这种动态获取类的内容以及动态调用对象的方法和获取属性的机制,就叫做JAVA 的反射机制 创建一个普通的类 public class Car { public String color="red"; public Integer price=10000; public void run () { System.out.println("我是汽车 我会跑!"); } } 简单的应用 /** * 反

m0_46937429的博客 1057

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

java反射基础

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

学习指针路上的小学渣的博客 1945

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Java反射基础

当我们在使用Java编写代码时,有时候需要在运行时动态地获取类的信息,例如类的构造函数、方法、字段等。这时候,Java反射就成为了一个非常有用的工具。Java反射是指在运行时动态地获取类的信息,并能够在运行时操作对象。Java反射提供了一种机制,可以在运行时获取类的构造函数、方法、字段等信息,并能够在运行时动态地创建对象、调用方法、访问字段等。下面,我们将介绍Java反射的一些基本概念和使用方法。JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;

Dreamgeek的博客 700

Java基础之—反射(四)

Java基础之—反射(四) 一、概述 主要介绍通过反射创建具体类的对象。 二、创建具体类对象方法 import java.lang.reflect.Constructor; class User{ public User(){} private User(String name){} public String toString() { return "User对象";...

Bruce小鬼 948

【Java】基础——反射(Reflection)基础

本篇对反射基础进行了讲解。什么是Java语言的反射机制?反射都提供了什么功能?反射有什么作用?反射如何获取Class对象?反射如何创建类对象?反射如何获取类的成员变量和类的成员方法?

2301_79456272的博客 865

Java基础——反射

反射知识点i总结

qq_52117201的博客 274

Java安全基础-反射机制

反射是一种想象你在餐厅点餐,服务员递给你一本菜单。传统方式是根据菜单上的菜品直接点单,但反射就像你拿到菜单后,不仅能看到菜品名称,还能知道每道菜的原料、烹饪方法,甚至可以要求厨师按照你的方式调整口味。Java 反射机制赋予程序在运行时动态解析类结构的能力,让代码具备了类似 "透视" 的魔法。

weixin_45534587的博客 1145

【Java基础-java反射】Java反射知识点(有这一篇就够了)

【Java基础-java反射】Java反射知识点(有这一篇就够了) 反射是框架设计的灵魂 (使用的前提条件:必须先得到代表的字节码的Class,Class类用于表示.class文件(字节码)) 文章目录【Java基础-java反射】Java反射知识点(有这一篇就够了)1、反射的概述1.1 什么是反射2 查看Class类在java中的api详解(1.7的API)3. Java反射的应用3.1 如...

【程序员不弃】的博客 7660

Java基础加强之反射

/*反射的基石:Class类  *Java程序中各个Java类属于同一类事物描述这类事物的Java类名就是Class  *Class类代表Java类,它的各个实例对象分别对应各个类在内存中的的字节码对象 package cn.baidu.com; import java.lang.reflect.*; import java.util.Arrays; public class

时光代码 818

Java基础 反射

Java基础 反射

qq_39560643的博客 196
上一篇: Spring AOP学习笔记(三)-SpringAOP使用XML配置的方式实现切面
下一篇: java多线程-死锁和死锁避免
markliwei1
博客等级 码龄10年 26粉丝 104原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值