Java的反射中一些重要的方法

原理

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

  • Java中有个Object 类,是所有Java 类的继承根源,其内声明了数个应该在所有Java 类中被改写的方法:hashCode()、equals()、clone()、toString()、getClass()等。其中getClass()返回一个Class 对象。Class对象十分特殊。他是Java中所有类的实例,借助它可以实现对一个对象的操作。

实例

1. 准备工作

  • 创建Person类

    public class Person {
    private String name;
    private String age;
    private void shot(){
        System.out.println("!!!");
    }
    protected void shot1() {
        System.out.println("111");
    }
    public String getAge() {
        return age;
    }
    public String getName() {
        return name;
    }
    public void setAge(String age) {
        this.age = age;
    }
    public void setName(String name) {
        this.name = name;
    }
    }

2. 创建Class对象

  • 通过getClass()

    Person person = new Person();
    Class<?> class2 = person.getClass();
  • 通过Class.forName()

    Class<?> class1 = Class.forName("test0118.testR.Person");
  • .class

    Class<?> class3 = Person.class;

3. 对对象属性进行操作

  • 获取类的属性

    • getFields()只能访问类中声明为公有的字段,私有的字段它无法访问,能访问从其它类继承来的公有方法.

    • getDeclaredFields()能访问类中所有的字段,与public,private,protect无关,不能访问从其它类继承来的方法

      Field[] fields = class1.getDeclaredFields();
      Field[] fields2 = class1.getFields();
      for (Field field : fields) {
          System.out.println(Modifier.toString(field.getModifiers()) + field.getName());
      }
      for(Field field:fields2){
          System.out.println(Modifier.toString(field.getModifiers())+field.getName());//由于Person类中并没有公有字段,所以该循环不输出任何值
      }
      /**
      输出:  
      privatename
      privateage
      */
  • 获取类属性的修饰符
    上述代码中有一个方法Modifier.toString(field.getModifiers())即是获取该属性的修饰符,field.getModifiers()返回一个int值,将该值转化为对应的描述要用到Modifier.toString()方法。

  • 对类的属性进行操作

    Field field = class1.getField("name");
    Object object = class1.newInstance();
    field.setAccessible(true);//打破了封装的特性,允许对私有属性直接进行操作
    field.set(object, "123");
    System.out.println(field.get(object));
  • 获取类的方法

    • getMethods()返回某个类的所有公用(public)方法包括其继承类的公用方法,当然也包括它所实现接口的方法。

    • getDeclaredMethods()对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。当然也包括它所实现接口的方法。

      Method[] methods = class1.getDeclaredMethods();
      Method[] methods2 = class1.getMethods();
  • 获取方法的参数和返回值的类型

    • method.getParameterTypes():获取方法参数类型,返回Class<?>数组

    • method.getReturnType():获取方法返回值类型,返回Class<?>对象

      Class<?>[] ty = method.getParameterTypes();
      Class<?> rty = method.getReturnType();
  • 使用反射调用方法

    • method.invoke(对象,参数...)

      Object object = class1.newInstance();
      Method method = class1.getMethod("setName", Class.forName("java.lang.String"));
      method.invoke(object, "123123");
      Method method2 = class1.getMethod("getName");
      System.out.println((String) method2.invoke(object));
      System.out.println(method.getReturnType());

Cesar学习笔记
该专栏用来记录学习的重要内容,以及分享一些练手的项目,有空了也把以前的笔记整理一下发上来。

Talk is cheap

277 声望
10 粉丝
0 条评论
推荐阅读
从Java中的取反号‘~’看原码,反码,补码
缘起 一次在写测试程序的时候,随手对2取了一个反,当时代码大意如下: {代码...} 按照我当时的想法,觉得过程应该是这样的: a = 2,也就是说a的二进制位10,取反就变成了01,所以结果应该为1。 但是实际的结果值是...

Cesar3阅读 8.2k

一文搞懂秒杀系统,欢迎参与开源,提交PR,提高竞争力。早日上岸,升职加薪。
前言秒杀和高并发是面试的高频考点,也是我们做电商项目必知必会的场景。欢迎大家参与我们的开源项目,提交PR,提高竞争力。早日上岸,升职加薪。知识点详解秒杀系统架构图秒杀流程图秒杀系统设计这篇文章一万多...

王中阳Go32阅读 2.4k评论 1

封面图
计算机网络连环炮40问
本文已经收录到Github仓库,该仓库包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校招社招分享等核心知识点,欢迎star~

程序员大彬14阅读 1.7k

万字详解,吃透 MongoDB!
MongoDB 是一个基于 分布式文件存储 的开源 NoSQL 数据库系统,由 C++ 编写的。MongoDB 提供了 面向文档 的存储方式,操作起来比较简单和容易,支持“无模式”的数据建模,可以存储比较复杂的数据类型,是一款非常...

JavaGuide8阅读 1.6k

封面图
花了半个小时基于 ChatGPT 搭建了一个微信机器人
相信大家最近被 ChatGPT 刷屏了,其实在差不多一个月前就火过一次,不会那会好像只在程序员的圈子里面火起来了,并没有被大众认知到,不知道最近是因为什么又火起来了,而且这次搞的人尽皆知。

Java极客技术12阅读 3.1k评论 3

封面图
数据结构与算法:二分查找
一、常见数据结构简单数据结构(必须理解和掌握)有序数据结构:栈、队列、链表。有序数据结构省空间(储存空间小)无序数据结构:集合、字典、散列表,无序数据结构省时间(读取时间快)复杂数据结构树、 堆图二...

白鲸鱼9阅读 5.2k

PHP转Go实践:xjson解析神器「开源工具集」
我和劲仔都是PHP转Go,身边越来越多做PHP的朋友也逐渐在用Go进行重构,重构过程中,会发现php的json解析操作(系列化与反序列化)是真的香,弱类型语言的各种隐式类型转换,很大程度的减低了程序的复杂度。

王中阳Go11阅读 2.7k评论 4

封面图

Talk is cheap

277 声望
10 粉丝
宣传栏