0

0

Java反射机制的知识点有哪些

王林

王林

发布时间:2023-05-21 12:34:20

|

1038人浏览过

|

来源于亿速云

转载

类的声明周期

java源代码----->javac-------------->java字节码文件-------------->java----------------->类对象(所在内存空间:元空间,本地内存)------------------------new--------->实例化对象------------------gc------------->卸载对象

Java反射机制的知识点有哪些

不同阶段都可以获取类对象

  • 对象.getClass() (内存阶段)

  • Test.class (元空间)

  • class.forName(“类全名:包名+类名”) :(硬盘)都没有进入内存空间就可以拿到对象

    立即学习Java免费学习笔记(深入)”;

举例来说,当我们使用jdbc操作数据库时,在这个类进入内存之前,我们可以使用该类的完整名称——包名+类名,调用该类并使用

Java反射机制的知识点有哪些

获取Class类对象的方式的场景

  • Class.forName(“类全名”) :多用于配置文件,将类名定义在配置文件中,读取配置文件,加载类

  • 类名.class : 多用于参数的传递

  • 对象名.getClass():多用于对象获取类对象

总结:同一个类加载器加载的文件在一次程序运行过程中,只会被加载一次,无论使用哪种方式获得的类对象都是同一个

代码示例:

package com.reflect;
public class TestReflectPerson {
    public static void main(String[] args) throws ClassNotFoundException {
        //1.class.forName()
        Class class1=Class.forName("com.reflect.Person");
        System.out.println(class1);
        //2.类名.class
        Class class2=Person.class;
        System.out.println(class2);
        //2.对象名.getClass()
        Class class3=new Person().getClass();
        System.out.println(class3);
        System.out.println(class1==class2);  //true
        System.out.println(class2==class3);  //true
    }
}

class类对象的功能

获取成员变量 : 取所有:类对象.getDeclaredFields() ,获取一个:类对象.getDeclaredField()

  • 设置值 set(Object obj,Object value)

  • 获取值 get(Object obj)

获取任意权限修饰的成员变量获取设置值,需要使用setAccessible(true)-----暴力反射

成员方法: 类对象.getDeclaredMethods()

执行方法 invoke(Object object ,Object… agrs) (参数个数任意,可有可无)

获取方法名getName()

构造方法: 类对象.getDeclaredConstructors()

虽然必须具备无参构造方法,但是使用 newInstance() 方法可以省略获取构造方法并获取对象的步骤

该方法需要实际情况构造方法赋实参

AI智研社
AI智研社

AI智研社是一个专注于人工智能领域的综合性平台

下载
//获得构造方法对象,
        Constructor cons1 = pcla.getDeclaredConstructor(String.class, int.class);
        Person p2 = (Person)cons1.newInstance("李四",19);
        System.out.println("p2:"+p2.getName());

newInstance()如果是创建无参构造方法去创建对象,可以使用类对象来创建对象,跳过获得构造方法对象

获取

获得类的名称:getName() 打印出全名:类名+包名

只想打印单独类名:getSimpleName()

获取类的成员变量名称

Java反射机制的知识点有哪些

属性文件:内容以等号连接形如k=v,

Java反射机制的知识点有哪些

代码示例:

package com.reflect;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class TestReflectPerson {
    public static void main(String[] args) throws Exception {
       /* //1.class.forName()
        Class class1=Class.forName("com.reflect.Person");
        System.out.println(class1);
        //2.类名.class
        Class class2=Person.class;
        System.out.println(class2);
        //2.类名.getClass()
        Class class3=new Person().getClass();
        System.out.println(class3);
        System.out.println(class1==class2);
        System.out.println(class2==class3);*/
        //获取对象
        Class tclass=Class.forName("com.reflect.Person");
        //通过类对象获取成员变量们
        Field[] fields = tclass.getDeclaredFields();
        System.out.println("获取Person对象的所有属性对象");
        for (Field field:fields){
           System.out.println(field);
       }
        //指定获取Person对象的属性对象
        System.out.println("指定获取Person对象的属性对象");
        Field age=tclass.getDeclaredField("age");
        System.out.println("age:"+age);
        //通过类对象获取所有的构造方法
        Constructor[] constructors = tclass.getDeclaredConstructors();
        System.out.println("获取Person的所有构造方法对象");
        for (Constructor constructor:constructors){
            System.out.println(constructor);
        }
        //通过类对象获取无参的构造方法
        Constructor constructor = tclass.getDeclaredConstructor();
        System.out.println("constructor:"+constructor);
        //通过类对象获取有参的构造方法
        Constructor constructor1 = tclass.getDeclaredConstructor(String.class,int.class);
        System.out.println("constructor1:"+constructor1);
        //通过类对象获取所有的成员方法
        Method[] methods = tclass.getDeclaredMethods();
        for (Method method:methods){
            System.out.println("method:"+method);
        }
        //通过类对象获取getAge成员方法
        Method getAge = tclass.getDeclaredMethod("getAge");
        System.out.println("getAge:"+getAge);
        //通过类对象获取getAge成员方法
        Method setAge = tclass.getDeclaredMethod("setAge", int.class);
        System.out.println("setAge:"+setAge);
    }
}

获取成员变量代码示例:

package com.reflect;
import java.lang.reflect.Field;
public class TestField {
    public static void main(String[] args) throws Exception {
        Class pcla=Person.class;
        /*//获取公共访问权限的成员变量
        Field[] fields = pcla.getFields();
        for (Field field:fields){
            System.out.println("getFild:"+field);
        }
        System.out.println();
        //获取所有访问权限的成员变量
        Field[] fielddes = pcla.getDeclaredFields();
        for (Field field:fielddes){
            System.out.println("field:"+field);
        }*/
        Field name = pcla.getDeclaredField("name");
        System.out.println(name);
        Person person=new Person();
        //暴力反射:获取任意访问权限修饰符的安全检查
        name.setAccessible(true);
        //获取公共成员变量的值
        Object value = name.get(person);
        System.out.println(value);
        //获取任意访问权限的成员变量的值
        Object value2 = name.get(person);
        System.out.println("value2:"+value2);
        //设置任意访问权限的成员变量的值
        name.set(person,"张三");
        Object value3=name.get(person);
        System.out.println("name:"+value3);
    }
}

如何获取私有变量的值

//暴力反射:获取任意访问权限修饰符的安全检查
name.setAccessible(true);

根据有无主方法判断进程和线程

进程:含有自己的主方法,可以依托自己的主方法启动,叫做进程

线程:没有自己的主方法,需要依赖其他工具来运行

例如:servlet就需要借助tomcate来运行,tomcate有自己的一个主方法

反射出现的背景(记住)

举例:在servlet通过借助工具tomcate来运行时,tomacate运行项目时访问不到类的资源,由此产生了反射

tomcate为什么拿不到new的对象

详解:tomcate不可能通过new的方式来调用,因为tomacate是先产生写好的,类是后来写的,所以tomcate不知道new的对象的是什么,可以通过包扫描的方式来获取文件路径,但是这样也无法使用new的方式,由此产生了反射。

ate有自己的一个主方法

反射出现的背景

举例:在servlet通过借助工具tomcate来运行时,tomacate运行项目时访问不到类的资源,由此产生了反射

tomcate为什么拿不到new的对象?

详解:tomcate不可能通过new的方式来调用,因为tomacate是先产生写好的,类是后来写的,所以tomcate不知道new的对象的是什么,可以通过包扫描的方式来获取文件路径,但是这样也无法使用new的方式,由此产生了反射。

tomcate想调用doGet,doPost的方法时,因为这两个方法不是静态的,必须通过new对象才能调用,但是tomcate又不能创建对象,所以由此产生反射来获取文件

相关文章

java速学教程(入门到精通)
java速学教程(入门到精通)

java怎么学习?java怎么入门?java在哪学?java怎么学才快?不用担心,这里为大家提供了java速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
C++ 设计模式与软件架构
C++ 设计模式与软件架构

本专题深入讲解 C++ 中的常见设计模式与架构优化,包括单例模式、工厂模式、观察者模式、策略模式、命令模式等,结合实际案例展示如何在 C++ 项目中应用这些模式提升代码可维护性与扩展性。通过案例分析,帮助开发者掌握 如何运用设计模式构建高质量的软件架构,提升系统的灵活性与可扩展性。

14

2026.01.30

c++ 字符串格式化
c++ 字符串格式化

本专题整合了c++字符串格式化用法、输出技巧、实践等等内容,阅读专题下面的文章了解更多详细内容。

9

2026.01.30

java 字符串格式化
java 字符串格式化

本专题整合了java如何进行字符串格式化相关教程、使用解析、方法详解等等内容。阅读专题下面的文章了解更多详细教程。

12

2026.01.30

python 字符串格式化
python 字符串格式化

本专题整合了python字符串格式化教程、实践、方法、进阶等等相关内容,阅读专题下面的文章了解更多详细操作。

4

2026.01.30

java入门学习合集
java入门学习合集

本专题整合了java入门学习指南、初学者项目实战、入门到精通等等内容,阅读专题下面的文章了解更多详细学习方法。

20

2026.01.29

java配置环境变量教程合集
java配置环境变量教程合集

本专题整合了java配置环境变量设置、步骤、安装jdk、避免冲突等等相关内容,阅读专题下面的文章了解更多详细操作。

18

2026.01.29

java成品学习网站推荐大全
java成品学习网站推荐大全

本专题整合了java成品网站、在线成品网站源码、源码入口等等相关内容,阅读专题下面的文章了解更多详细推荐内容。

19

2026.01.29

Java字符串处理使用教程合集
Java字符串处理使用教程合集

本专题整合了Java字符串截取、处理、使用、实战等等教程内容,阅读专题下面的文章了解详细操作教程。

3

2026.01.29

Java空对象相关教程合集
Java空对象相关教程合集

本专题整合了Java空对象相关教程,阅读专题下面的文章了解更多详细内容。

6

2026.01.29

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 3万人学习

C# 教程
C# 教程

共94课时 | 8万人学习

Java 教程
Java 教程

共578课时 | 53.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号