Java基础之——反射

RedCap:一种通信技术的概述 总结起来,RedCap是一种基于数据包交换的通信技术,它提供了一种高效、可靠的数据传输机制。通过使用RedCap,我们可以轻松地发送和接收数据包,并确保数据的完整性和正确性。在上面的示例中,我们首先导入了RedCap库,并创建了一个RedCap实例。然后,我们定义了目标地址和源地址,并创建了一个数据包,其中包含了目标地址、源地址和要发送的数据。本文将介绍RedCap的基本原理和使用方法,并提供一些相关的源代码示例。RedCap还提供了其他一些功能,如数据包的重传机制、流量控制和拥塞控制等。 阅读详情

一、反射概述

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

要想解剖一个类,必须先要获取到该类的字节码文件对象。而解剖使用的就是Class类中的方法.所以先要获取到每一个字节码文件对应的Class类型的对象

反射的使用步骤:

          1、获取想要操作的类的Class对象,它是反射的核心,通过Class对象我们可以任意调用类的方法

          2、调用Class类中的方法,即就是反射的使用阶段

          3、通过反射API来操作这些信息

二、获取Class对象的3种方法

1、第一种:调用某个对象的getClass()方法

2、第二种:调用某个类的class属性来获取该类对应的Class对象

3、第三种:使用Class类中的forName()静态方法

代码如下图:

public class Demo01 {

    public static void main(String[] args) {
        //第一种:调用某个对象的getClass()方法
        Person p = new Person();
        Class clazz1 = p.getClass();

        //第二种:调用某个类的class属性来获取该类对应的Class对象
        Class clazz2 = Person.class;

        //第三种:使用Class类中的forName()静态方法
        Class clazz3 = null;
        try {
            clazz3 = Class.forName("Java基础.Java反射.Person");
        } catch (ClassNotFoundException e){
            e.printStackTrace();
        }

    }
}

第一种方法的getClass()方法来源Object

第二种方法是因为任何数据类型(包括基本数据类型)都有一个“静态”的class属性,可以参见JDK对Class类的描述,这里读者感兴趣的话可以在自己的编辑器中打开JDK源码,列如Integer,Long等基本数据类型包装类,它们都有一个static final的class属性。

第三种方法是Class类的静态方法;这三种方法常用的是第三种,第一种对象都有了,反射显得很多于,第二种需要导入类的包,很麻烦容易出错。

三、获取类中的信息(构造方法、成员变量、成员函数)

  1. 通过反射获取构造方法并使用:

Person1类:

package Java基础.Java反射;

public class Person1 {
    //---------------构造方法---------------
    //默认构造方法
    Person1(String str) {
        System.out.println("默认的构造方法:" + str);
    }

    //无参构造方法
    public Person1() {
        System.out.println("无参构造方法");
    }

    //有一个参数的构造方法
    public Person1(int age) {
        System.out.println("有一个参数的构造方法");
    }

    //有多个参数的构造方法
    public Person1(String name, int age) {
        System.out.println("姓名:" + name+ "年龄:" + age);
    }

    //受保护的构造方法
    protected Person1(char c){
        System.out.println("受保护的构造方法,参数为char型" );
    }

    //私有的构造方法
    private Person1(Long L){
        System.out.println("私有的构造方法,参数为Long型");
    }
}

测试类:

package Java基础.Java反射;

import java.lang.reflect.Constructor;

public class Demo03 {

    public static void main(String[] args) throws Exception{
        //加载Class对象
        Class clazz = Class.forName("Java基础.Java反射.Person1");

        System.out.println("----------获取所有公共构造方法-----------");
        Constructor[] array = clazz.getConstructors();
        for(Constructor c : array){
            System.out.println(c);
        }

        System.out.println("----------获取指定的公共构造方法-----------");
        Constructor con = clazz.getConstructor();
        System.out.println("无参的con = " + con);
        Object obj = con.newInstance();

        con = clazz.getConstructor(int.class);
        System.out.println("有一个参数的con = " + con);
        obj = con.newInstance(1);  //调用构造方法

        System.out.println("----------获取所有的构造方法-----------");
        array = clazz.getDeclaredConstructors();
        for(Constructor c : array){
            System.out.println(c);
        }

        System.out.println("----------获取私有构造方法-----------");
        con = clazz.getDeclaredConstructor(Long.class);
        System.out.println(con);
        con.setAccessible(true); //暴力访问(忽略掉访问修饰符)
        obj = con.newInstance(1l); //调用构造方法

        con = clazz.getDeclaredConstructor(char.class);
        System.out.println(con);
        con.setAccessible(true); //暴力访问(忽略掉访问修饰符)
        obj = con.newInstance('b'); //调用构造方法
    }
}

运行结果:

----------获取所有公共构造方法-----------
public Java基础.Java反射.Person1(java.lang.String,int)
public Java基础.Java反射.Person1(int)
public Java基础.Java反射.Person1()
----------获取指定的公共构造方法-----------
无参的con = public Java基础.Java反射.Person1()
无参构造方法
有一个参数的con = public Java基础.Java反射.Person1(int)
有一个参数的构造方法
----------获取所有的构造方法-----------
private Java基础.Java反射.Person1(java.lang.Long)
protected Java基础.Java反射.Person1(char)
public Java基础.Java反射.Person1(java.lang.String,int)
public Java基础.Java反射.Person1(int)
public Java基础.Java反射.Person1()
Java基础.Java反射.Person1(java.lang.String)
----------获取私有构造方法-----------
private Java基础.Java反射.Person1(java.lang.Long)
私有的构造方法,参数为Long型
protected Java基础.Java反射.Person1(char)
受保护的构造方法,参数为char型

 1.1:getConstructors():是获得所有的公共构造方法

 1.2:getConstructor(Class<?>...   parameterTypes):是获得指定的公共构造方法,无参就不传入参数,如果有,就一次传入参数,如int.class,long.class等等

 1.3:getDeclaredConstructors(Class<?>...   parameterTypes):是获取所有的构造方法,Declared意为声明过的

 1.4:getDeclaredConstructor():获取私有构造方法,准确说,获取指定的所有构造方法,私有的能获取,公有的当然也能获取,上面没做这个测试,感兴趣的朋友可以自己试试

     2.通过反射获取成员变量

Person2类:

package Java基础.Java反射;

public class Person2 {
    //成员变量
    public String name;
    protected int age;
    private char sex;
    String height;

    @Override
    public String toString() {
        return "Person2{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", sex=" + sex +
                ", height='" + height + '\'' +
                '}';
    }
}

测试类:

package Java基础.Java反射;

import java.lang.reflect.Field;

public class Demo04 {

    public static void main(String[] args) throws Exception{
        //加载Class对象
        Class clazz = Class.forName("Java基础.Java反射.Person2");

        System.out.println("----------获取所有公有的字段-----------");
        Field[] array = clazz.getFields();
        for(Field c : array){
            System.out.println(c);
        }
        System.out.println("----------获取指定的公共字段----------");
        Field name = clazz.getField("name");
        System.out.println(name);
        //获取一个对象
        Object obj = clazz.getConstructor().newInstance();
        name.set(obj,"反射");
        Person2 p = (Person2)obj;
        System.out.println("验证姓名:" + p.name);

        System.out.println("----------获取所有的字段----------");
        array = clazz.getDeclaredFields();
        for(Field c : array){
            System.out.println(c);
        }
        System.out.println("----------获取私有字段并调用-----------");
        name = clazz.getDeclaredField("sex");
        System.out.println(name);
        name.setAccessible(true);
        name.set(obj,'男');
        System.out.println("验证性别:" + p);
    }
}

运行结果:

----------获取所有公有的字段-----------
public java.lang.String Java基础.Java反射.Person2.name
----------获取指定的公共字段-----------
public java.lang.String Java基础.Java反射.Person2.name
验证姓名:反射
----------获取所有的字段---------------
public java.lang.String Java基础.Java反射.Person2.name
protected int Java基础.Java反射.Person2.age
private char Java基础.Java反射.Person2.sex
java.lang.String Java基础.Java反射.Person2.height
----------获取私有字段并调用-----------
private char Java基础.Java反射.Person2.sex
验证性别:Person2{name='反射', age=0, sex=男, height='null'}

2.1  这几个方法的使用与上面的构造方法的演示差不多,这里不重复说了

2.2  要调用字段时,先通过clazz.getConstructor().newInstance()构造一个实例对象 =>等同于Person2 p = new Person2();

2.3  为字段设置值 name.set(obj, "反射") =>等同于p.name = "反射";第一参数是设置的对象,第二个参数是实参;

     3.   通过反射获取成员方法

Person3类:

package Java基础.Java反射;

public class Person3 {
    //----------成员方法-----------
    public void method1(String str){
        System.out.println("调用了公有方法,参数为String:" + str);
    }
    protected void method2(){
        System.out.println("调用了受保护方法,无参数");
    }
    private String method3(int age){
        System.out.println("调用了私有方法,参数为Int:" + age);
        return "我是method3的返回值";
    }
    void method4(){
        System.out.println("调用了默认方法,无参数");
    }
}

测试类:

package Java基础.Java反射;
import java.lang.reflect.Method;
public class Demo05 {
    public static void main(String[] args) throws Exception{
        //加载Class对象
        Class clazz = Class.forName("Java基础.Java反射.Person3");

        System.out.println("----------获取所有公有的方法-----------");
        Method[] array = clazz.getMethods();
        for(Method m : array){
            System.out.println(m);
        }
        System.out.println("----------获取指定的method1公有方法-----------");
        Method m = clazz.getMethod("method1", String.class);
        System.out.println(m);
        //获取一个对象
        Object obj = clazz.getConstructor().newInstance();
        m.invoke(obj, "method1");

        System.out.println("----------获取所有声明的方法---------------");
        array = clazz.getDeclaredMethods();
        for(Method a : array){
            System.out.println(a);
        }
        System.out.println("----------获取私有的method3方法并调用-----------");
        m = clazz.getDeclaredMethod("method3", int.class);
        System.out.println(m);
        m.setAccessible(true);  //解除私有限定
        Object ret = m.invoke(obj, 20);
        System.out.println("返回值:" + ret);
    }
}

运行结果:

----------获取所有公有的方法-----------
public void Java基础.Java反射.Person3.method1(java.lang.String)
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 java.lang.String java.lang.Object.toString()
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()
----------获取指定的method1公有方法-----------
public void Java基础.Java反射.Person3.method1(java.lang.String)
调用了公有方法,参数为String:method1
----------获取所有声明的方法---------------
void Java基础.Java反射.Person3.method4()
protected void Java基础.Java反射.Person3.method2()
public void Java基础.Java反射.Person3.method1(java.lang.String)
private java.lang.String Java基础.Java反射.Person3.method3(int)
----------获取私有的method4方法并调用-----------
private java.lang.String Java基础.Java反射.Person3.method3(int)
调用了私有方法,参数为Int:20
返回值:我是method3的返回值

3.1  调用成员方法与上面不同的是clazz.getMethod("method1", String.class)和clazz.getDeclaredMethod("method3", int.class)必须传入两个参数,第一个是要找的指定方法名,第二个是参数的类型

3.2  m.setAccessible(true) //解除私有限定,没有这行代码就会报如下错误提示

 

NXP S32k3 MCAL ADC配置 S32K3 配置MCAL ADC 阅读详情

相关推荐

基于Multisim设计电子密码锁

一、设计任务与要求:(可软件仿真实现)1)基本要求:设计一个数字密码锁,要求只有按正确的顺序,输入正确的密码,方能输出开锁信号,实现开锁。设置三个正确的密码键和若干个伪键,任何伪键按下后,密码锁都无法打开。每次只能接受四次按键信号,而且第四个键只能是“确定”或者“重输键”,其他无效。能显示已输入键的个数2)扩展要求:第一次密码输错后,可以输入第二次,但是连续三次输错,密码将被锁,必须按复位键才能解锁。

ablinger的博客 4419

Java-反射基础

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

luxury的博客 1653

手把手教你用OpenCalib完成激光雷达与相机联合标定:从数据准备到结果可视化

本文详细介绍了使用OpenCalib工具链中的lidar2camera模块完成激光雷达与相机联合标定的全流程,包括数据准备、标定命令执行、结果验证与可视化。通过实战指南,帮助读者掌握工业级标定技术,提升自动驾驶和机器人领域的传感器融合精度。

weixin_30872499的博客 400

Java 基础 - 反射

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

哈哈哈哈丶昊的博客 946

从业10年的AI应用架构师:企业AI平台运营的4个核心经验,值得收藏

去年年底,我在某大型制造企业做AI咨询时,遇到了这样的场景:这不是个例。我接触过的10家企业中,有7家的AI平台都陷入了“技术自嗨”的陷阱——技术团队追求模型精度、功能完备性,却忽略了业务到底需要什么。如果你也遇到过类似问题:比如“模型准确率很高,但业务不买账”“AI项目上线后没人用”“投入产出比极低”,那么这篇文章的4个经验,可能会帮你避开这些坑。很多企业认为,AI平台就是“买一套工具+部署几个模型”。但实际上,企业AI平台的本质是“技术与业务的连接生态”:根据Gartner的报告,80%的企业AI项目失

AI 原生应用开发的博客 709

ARIMA模型的R实现

1.模型简介 ARIMA模型,全称差分自回归移动平均模型。可以看作是差分运算和ARMA模型的结合。主要是针对具有线性趋势的非平稳的时间序列,来进行建模预测。 ARIMA模型的形式如下: Φ(B)∇

heirenmin的博客 1万+

Java基础—反射

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

左灯右行的爱情 1030

树根互联Java开发面试题及参考答案

说一下 Java 集合类。 Java 集合类是用于存储和操作一组对象的容器。它提供了多种数据结构,方便程序员对数据进行高效的管理和处理。 Java 集合框架主要包括两大接口:Collection 和 Map。 Collection 接口是一组对象的集合,它有三个主要的子接口:List、Set 和 Queue。 List 接口代表有序的集合,可以包含重复的元素。例如 ArrayList,它是基于数组实现的动态数组。它的优点是随机访问效率高,通过索引访问元素的时间复杂度为 O (1)。当

大模型大数据攻城狮的专栏 856

Java基础之—反射(一)

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

Bruce小鬼 975

【WorkBuddy专栏51】Codex与WorkBuddy的底层基因——两条完全不同的AI智能体路线(上)

【WorkBuddy专栏51】Codex与WorkBuddy的底层基因——两条完全不同的AI智能体路线(上)

AI人人懂 2190

rk3576 点亮 LCD(eDP)

RK3576 处理器集成了对 **eDP (Embedded DisplayPort)** 接口的支持,主要用于驱动嵌入式或笔记本电脑的内置屏幕。支持 **eDP 1.3 版本协议**, 最大可支持 ****4K@120Hz**。

weixin_35723192的博客 355

java反射基础知识总结

java反射基础知识总结

笔杆__的博客 340

国产上位机软件突围:适配统信UOS/麒麟OS的跨平台开发技术与实践(2026年信创实战指南)

(航天科技集团CTO):“在信创战场上,1ms的延迟意味着1个卫星的控制失效。2026年,C#/.NET MAUI不是选择,而是我们守护卫星的‘生命线’。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 414

Java 反射基础

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

TGO-Ming 884

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Java 基础之反射

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

m0_46937429的博客 1057

温度PID控制PLC程序

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

Java反射基础

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

Dreamgeek的博客 700

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

java反射基础

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

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

Java基础之—反射(四)

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

Bruce小鬼 949

Java基础——反射

反射知识点i总结

qq_52117201的博客 274

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

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

2301_79456272的博客 865

【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安全基础-反射机制

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

weixin_45534587的博客 1145

Java基础 反射

Java基础 反射

qq_39560643的博客 196

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 反射基础

package test.reflect;import java.lang.annotation.Annotation;import java.lang.reflect.Method;public class reflect {public static void main(String[] args) {try {// 实例化类Object obj = Animal.class.newInsta...

weixin_39949776的博客 75
上一篇: Java异常详解
下一篇: Spring IoC和DI详解以及装配Bean
GL60708
博客等级 码龄10年 5粉丝 13原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值