我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Java的反射机制一起来看看

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Java的反射机制一起来看看

一、什么是反射机制?

反射就是运行时识别类的能力,在运行时可以获得当前对象的类结构,动态创建类的实例,调用对象的方法等;

获得Class类对象的三种方式:

方式一 :Class.forName(“类名”);

Class类的一个静态方法forName 加载类获得类对象 运行的类库中没有Person类,程序依然可以编译。

Class cls = Class.forName("com.oracle.vo.Person");

方式二: 类名.class

要求运行的类库一定要有Person类

//编译的字节码文件中,会为每个类 定义一个静态的属性class 类型是Class类型
//会为每个类定义一个属性,存储自己类的类对象
Class cls = Person.class;

方式三: 对象.getClass()

要求运行的类库中一定要有Person类 当持有了一个对象时,可以根据对象获得其类对象

Person p = new Person();
//getClass方法是Object类的方法,所有的对象都有getClass方法
Class cls = p.getClass();

二、Class类

API方法

1. getName() 获得类对象对应类的类名(全类名:包名+类名)

2. getSimpleName() 获得类对象对应类的类名

3. getPackage() 获得类对象对应类的包对象

try {
    Class cls = Class.forName("com.oracle.vo.Person");
    System.out.println(cls.getName());
    System.out.println(cls.getSimpleName());
    Package page = cls.getPackage();
    System.out.println(page.getName());
    } catch (ClassNotFoundException e) {
 
    e.printStackTrace();
}

4. getField(String name) 根据名字获得能访问的属性。

5. getDeclaredField(String name) 根据名字获得属性。

6. getDeclaredFields() 获得所有的属性

7. getDeclaredMethod()

8. getDeclaredConstructor(Class... types) 根据参数列表获得构造器

9. newInstance() 通过无参构造器创建对象

10. getSuperClass() 获得父类的类对象

三、Package类

Package对象抽象为包

四、Field类

是属性的抽象,Field类的实例就是某个属性,Field类包括了属性名、属性类型、属性值、修饰范围等。

获得属性对象,主要的作用是对属性进行赋值或取值的操作。

1. get(Object obj) 返回Object :获得某个对象的属性值。

2. setAccessible(boolean flag) : 设置属性是否可访问。

3. set(Object obj,Object value) : 设置属性值

    public static void main(String[] args) {
        //获得Person的类对象 ,获得Person的Class对象
        Person p = new Person();
        p.setName("tom");
        try {
            Class cls = Class.forName("com.oracle.vo.Person");
            //获得Person类中所有的属性
            Field[] fields = cls.getFields();
            //获得Person类中的name属性
            Field field = cls.getDeclaredField("name");
            System.out.println(field.getName());
            //获得 某个Person对象 的name属性值
            //field: Person类的name属性
            //设置这个属性可访问,忽略修饰范围
            field.setAccessible(true);
            //设置p对象的name属性值 为jack
            field.set(p, "jack");
            System.out.println(field.get(p));
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } catch (SecurityException e) {
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }

五、Method类

invoke(Object obj, Object ... args) 返回Object : 执行method方法

    public static void main(String[] args) {
        //获得Person的类对象 ,获得Person的Class对象
        Person p = new Person();
        p.setName("tom");
        try {
            Class cls = Class.forName("com.oracle.vo.Person");
            //获得Person类的 method(String name) 方法对象
            Method method1 = cls.getDeclaredMethod("method", String.class);
            //获得Person类的 method() 方法对象
            Method method2 = cls.getDeclaredMethod("method");
            //method(int i,String name) 方法对象
            Method method3 = cls.getDeclaredMethod("method",int.class,String.class);
            //获得全部方法
            Method[] methods = cls.getDeclaredMethods();
            //获得方法要作什么? 就是要调用方法
            //obj参数: 调用哪个对象的方法
            method1.invoke(p, "abc");
            System.out.println(method3.invoke(p, 10,"abcd"));
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SecurityException e) {
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
    }

六、Constructor类

newInstance(Object ... args) 调用构造器创建对象

    public static void main(String[] args) {
        //获得Person的类对象 ,获得Person的Class对象
        Person p = new Person();
        p.setName("tom");
        try {
            Class cls = Class.forName("com.oracle.vo.Person");
            //获得 public Person() 构造器
            Constructor constructor1 = cls.getDeclaredConstructor();
            //public Person(String name, int age) 构造器
            Constructor constructor2 = cls.getDeclaredConstructor(String.class,int.class);
            //获得构造器的作用,要调用构造器创建对象
            Object obj1 = constructor1.newInstance();
            Object obj2 = constructor2.newInstance("tom",20);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SecurityException e) {
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
    }

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注编程网的更多内容! 

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Java的反射机制一起来看看

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Java反射的概念和机制

这篇文章主要讲解了“Java反射的概念和机制”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java反射的概念和机制”吧!1. 什么是反射?什么是反射?在官方文档中是这样说的:Reflecti
2023-06-02

一文带你读懂Java中的反射机制

本篇文章为大家展示了一文带你读懂Java中的反射机制,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。什么是反射机制反射是java语言的一个特性,它允程序在运行时(注意不是编译的时候)来进行自我检查并且
2023-05-31

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录