首页 > 编程语言 >Java反射

Java反射

时间:2024-09-24 17:14:24浏览次数:7  
标签:反射 Java name 构造方法 class public 类中 String

一、如何获取一个类:

1、Class cls = Class.forName("java.lang.String");

2、String str = "zhangsan";
   Class cls = str.getClass();

3、Class cls = String.class;  //注意String.class的class是小写的C

二、利用反射访问类中的字段:

1、getFields()方法:
获得某个类中所有的公有属性(public)的字段,包括这个类的父类中的public属性字段。

2、getDeclaredFields()方法:
获得某个类中所有属性的字段(public、private、protect),但是不包括这个类的父类。

代码演示:

现有一个 PersonalInfo类 和一个 StuInfo类,StuInfo类继承PersonalInfo类并重写了 toString()方法:

class PersonInfo{
    public String name = "zhangsan";
}

class StuInfo extends PersonInfo{
    public int age;
    private int money;

    @Override
    public String toString() {
        return "StuInfo{" +
                "name=" + name +
                ", money=" + money +
                '}';
    }
}

(1) 使用 getFields()方法获取 类StuInfo中的公有成员变量age和其父类中的公有成员变量name:

Class stiClass = StuInfo.clas;
// 获取public字段"age":
System.out.println(stiClass.getField("age"));
// 获取继承的public字段"name":
System.out.println(stiClass.getField("name"));

(2) 使用 getDeclared()方法获取 类StuInfo中的私有成员变量money:

Class stiClass = StuInfo.class;
System.out.println(stiClass.getDeclaredField("money"));

(3) 使用 newInstance()方法,利用反射创建实例化对象:

Field name = stiClass.getField("name");
System.out.println(name.get(stiClass.newInstance()));

(4) 利用setAccessible()方法设置私有属性money的值:

Field money = stiClass.getDeclaredField("money");
money.setAccessible(true);
money.set(stuInfo,2333333);

//Java 的 setAccessible 是一个访问控制方法,它可以用来控制 Java 中类的访问权限。如果某个成员变量被声明为 private 或 protected,普通的程序是不能访问它的。但是如果使用 setAccessible 方法将其设置为 true,程序就可以访问该变量了。

三、利用反射获取类中的方法:

1、Method getMethod(name, 参数类型):获取当前类中的某个public方法,包括其父类中的方法。

2、Method getDeclaredMethod(name, 参数类型):获取某个类中的某个任意属性的方法(public、private、protect),但不包括其父类中的方法。

3、Method[] getMethods():获取当前类中的所有public方法。

4、Method[] getDeclaredMethods():获取当前类中任意属性的所有方法,但不包括其父类中的方法。

代码演示:

public class reflectTest01 {
    public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        String name = "zhangsan";
        Method substring = String.class.getMethod("substring", int.class);
        System.out.println(substring.invoke(name, 3));
    }
}

//输出结果为 ngsan

Obj参数为null,代码如下:

Method m = Integer.class.getMethod("parseInt", String.class);
System.out.println(m.invoke(null, "3"));

//输出结果为 3

四、获取构造方法:

1、getConstructor(构造方法的参数类型1、构造方法的参数类型2、...):获取当前类中某个public属性的构造方法。

2、getDeclaredConstructor(构造方法的参数类型1、构造方法的参数类型2、...):获取当前类中某个任意属性的构造方法。

3、getConstructors(): 获取当前类中所有public属性的无参数构造方法。

4、getDeclaredConstructors():获取当前类中所有任意属性的无参数构造方法。

注:调用非public属性的构造方法时,必须要先通过 setAccessible(true)设置允许访问,setAccessible(true)可能会失败。

五、java反射进行命令执行:

java语句进行命令执行:

Windows:java.lang.Runtime.getRuntime().exec("cmd /c start calc");

MacOS:java.lang.Runtime.getRuntime().exec("open -na Calculator");

java反射语句进行命令执行:

Windows:
Class.forName("java.lang.Runtime").getMethod("getRuntime").invoke(null)
                .getClass().getMethod("exec", String.class).invoke(Runtime.getRuntime(),"cmd /c start calc");

MacOS:
Class.forName("java.lang.Runtime").getMethod("getRuntime").invoke(null)
                .getClass().getMethod("exec", String.class).invoke(Runtime.getRuntime(),"open -na Calculator");

六、修改被final关键字修饰的变量:

在 javaReflection.User 中,设有 final修饰的整数变量 finalNumber = 666:
image

通过下文代码即可进行修改并打印:

public class reflectTest01 {
    public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException, IOException, ClassNotFoundException, InstantiationException, NoSuchFieldException {
        Class userClass = Class.forName("javaReflection.User");
        User user = (User)userClass.newInstance();
        Field field = userClass.getDeclaredField("finalNumber");
        field.setAccessible(true);
        field.setInt(user, 100);
        System.out.println(field.get(user));
    }
}

//输出结果:
//无参数构造方法执行
//100

标签:反射,Java,name,构造方法,class,public,类中,String
From: https://www.cnblogs.com/kgty/p/18429126

相关文章

  • 基于Node.js+vue基于java的学生宿舍管理系统(开题+程序+论文) 计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容研究背景随着高等教育规模的不断扩大,学生宿舍作为校园生活的重要组成部分,其管理效率与服务质量直接关系到学生的日常生活体验及学校的整体管理水平。传统的学生宿舍......
  • Java多线程
    文章目录前言1实现多线程1.1多线程概述1.2多线程的实现方式1.3线程休眠1.4线程优先级1.5守护线程2线程同步2.1同步代码块2.2Lock锁2.3死锁3生产者消费者3.1生产者和消费者模式概述3.2阻塞队列基本使用3.3阻塞队列实现等待唤醒机制前言"劝君莫惜金......
  • javawar包反解析代码
    一:概述在JavaEE开发中,WAR(WebApplicationArchive)文件是Web应用程序的标准打包格式。它允许开发者将Web应用的所有组件打包成一个单一的文件,以便于部署和分发。然而,有时我们可能需要从WAR文件中提取信息或修改内容,这就需要进行WAR包的反解析。本文将探讨几种实现JavaWAR包反解析......
  • Java面试指南(基础篇)
    文章目录前言01Java语言的特点02JVM、JRE及JDK的关系03Java和C++的区别04基本数据类型05类型转换06自动装箱与拆箱07String的不可变性08字符常量和字符串常量的区别09字符串常量池10String类的常用方法11String和StringBuffer、StringBuilder的区别12switch......
  • 基于Java+Springboot+Vue开发的体育用品商城管理系统源码+开发文档
    项目简介该项目是基于Java+Springboot+Vue开发的体育用品商城管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的体育用品商城管理系统项目,大学生可以在实践中学习和......
  • 基于Java+Springboot+Vue开发的体育场馆预约管理系统源码+开发文档
    项目简介该项目是基于Java+Springboot+Vue开发的体育场馆预约管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的体育场馆管理系统项目,大学生可以在实践中学习和提升......
  • 基于Java+Springboot+Vue开发的旅游景区管理系统源码+参考文章1.3万字
    项目简介该项目是基于Java+Springboot+Vue开发的旅游景区管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的旅游景区管理系统项目,大学生可以在实践中学习和提升自己......
  • 基于Java+Springboot+Vue开发的鲜花商城管理系统源码+参考文章1.3万字
    项目简介该项目是基于Java+Springboot+Vue开发的鲜花商城管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的鲜花商城管理系统项目,大学生可以在实践中学习和提升自己......
  • Java对接企业微信审批回调
    一、需求说明用Java程序对接企业微信的审批流程,获取审批数据数据,例如:报销费用金额二、操作步骤2.1、分析需求根据需求分析其实也不知道该怎么去做对接,通过不断试错,发现不需要对接第三方应用,也就是不需要进入服务商后台页面,只需要在自建应用是做好配置即可。具体参考:htt......
  • 提升前端性能的JavaScript技巧
    背景最近在开发一个全新的Web应用时,我遭遇了一个让人抓狂的问题:页面的加载速度实在是太慢了,用户点击按钮后需要等上几秒才会有反应。作为一个对用户体验有着极高要求的开发者,我怎么能忍受这种情况?于是,我决心彻底优化应用的性能。经过一番钻研和实践,我总结出了一些提升前端性能的Jav......