首页 > 编程语言 >Java反射

Java反射

时间:2023-06-28 17:33:59浏览次数:46  
标签:反射 Java 获取 对象 clazz Person 方法 Class

动态语言:是指程序在运行是可以改变其结构,新的函数可以引进,已有的函数可以被删除等结构上的变化。比如常见的JavaScript就是动态语言,除此之外Ruby、Python等也属于动态语言,而C、C++则不属于动态语言。从反射角度说,Java属于半动态语言。

反射机制概念(运行状态中知道类所有的属性和方法)

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

反射的应用场合

编译器类型和运行时类型

在Java程序总许多对象在运行时都会出现两种类型:编译时类型和运行时类型。编译时类型由声明对象时实用的类型来决定,运行时的类型由实际赋值对象的类型决定。

如:Person p = new Student();其中编译时类型为Person,运行时类型为Student。

编译时类型无法获取具体方法

程序在运行时还可能接收到外部传入的对象,该对象的编译时类型时Object,但是程序有需要调用该对象的运行时类型的方法。为了解决这些问题,程序需要在运行时发现对象和类的真实信息。然而,如果编译时根本无法预知该对象和类属性那些类,程序只能依靠运行时信息来发现该对象和类的真实信息,此时必须使用到了反射了。

Java反射API

反射API用来生成JVM中的类、接口或则对象的信息

1.Class类:反射的核心类,可以获取类的属性、方法等信息。

2.Field类:java.lang.reflect包中的类,表示类的成员变量,可以用来获取和设置类中的属性值

3.Method类:java.lang.reflect包中的类,表示类的方法,它可以用来获取类中的方法信息或执行方法

4.Constructor类:java.lang.refect包中的类,表示类的构造方法

反射使用步骤(获取Class对象、调用对象方法)

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

2.调用Class类中的方法,既就是反射的使用阶段。

3.使用反射API来操作这些信息。

获取Class对象的3种方法

调用某个对象的getClass()方法

Person p = new Person();

Class clazz = p.getClass();

调用某个类的class属性来获取该类对应的Class对象

Class clazz = Person.class;

使用Class类中的forName()静态方法(最安全/性能最好)

Class clazz = Class.forName("类的全路径"); (最常用)

当我们获得了想要操作的Class对象后,可以通过Class类中的方法获取并查看该类中的方法和属性。

//获取 Person 类的 Class 对象
 Class clazz=Class.forName("reflection.Person");
//获取 Person 类的所有方法信息
 Method[] method=clazz.getDeclaredMethods();
 for(Method m:method){
 System.out.println(m.toString());
 }
 //获取 Person 类的所有成员属性信息
 Field[] field=clazz.getDeclaredFields();
 for(Field f:field){
 System.out.println(f.toString());
 }
 //获取 Person 类的所有构造方法信息
 Constructor[] constructor=clazz.getDeclaredConstructors();
 for(Constructor c:constructor){
 System.out.println(c.toString());
 }

创建对象的两种方法

Class对象的newInstance()

1.使用Class对象的newInstance()方法来创建该Class对象对应类的实例,但是这种方法要求该Class对象对应的类默认的空构造器。

调用Constructor对象的newInstance()

2.先使用Class对象获取指定的Constructor对象,再调用Constructor对象的newInstance()方法来先创建Class对象对应类的实例,通过这种方式可以选定构造方法创建实例。

//获取 Person 类的 Class 对象
 Class clazz=Class.forName("reflection.Person"); 
 //使用.newInstane 方法创建对象
 Person p=(Person) clazz.newInstance();
//获取构造方法并创建对象
 Constructor c=clazz.getDeclaredConstructor(String.class,String.class,int.class);
 //创建对象并设置属性
Person p1=(Person) c.newInstance("李四","男",20);

标签:反射,Java,获取,对象,clazz,Person,方法,Class
From: https://blog.51cto.com/u_11315052/6574555

相关文章

  • JavaScript引爆Salesforce职业生涯!抓住高薪机会
    Salesforce是一款领先的CRM软件,已被各种规模和行业的企业使用多年。Salesforce不仅易于使用,而且可定制,使企业能够改善其销售、营销、客户服务和其他业务流程。近年来,Salesforce一直在创新,从传统的基于Oracle的平台转变为在业界更具吸引力的解决方案。目前,许多工作可以由人工智能......
  • python基础 内置方法、反射,异常剩余内容
    魔术方法(内置方法)类类里面内置的双下划线开头的一些地方,它们具有特殊的功能,我们称之为魔术方法,简称魔法比如:__init__1.__str__,__repr__方法__str__:当打印和输出对象时,自动触发str方法,但还是str必须要有返回值,不然会报错,而且返回值必须是字符串。__repr__:它的使用......
  • 1. 使用 IntelliJ IDEA 开发 Azure Function APP (Java)
    1.1前提Azure账户并有可食用的订阅。创建免费的Azure账户。Azure支持的JavaDevelopmentKit(JDK),JDK8或JDK11。IntelliJIDEA无限制版本或社区版本均可。Maven3.5+最新的FunctionCoreTools1.2安装插件并登录在IntelliJIDEA中安装AzureToolkit插......
  • 解锁高质量文档转换:通过Java应用程序免费将PDF转换为XPS
    在当今数字时代,文档转换已经成为我们日常生活中不可或缺的一部分。然而,不是所有的文件格式都是平等无差的,在与他人共享文档时可能会遇到兼容性问题。这就是我们需要进行文件格式转换的原因,而将PDF转换为XPS是一种受欢迎的转换选择。如果你正在寻找一种使用Java将PDF文件转换为XPS......
  • 讯飞离线语音合成新版(Aikit)-android sdk合成 demo(Java版本)
    前言:科大讯飞的新版离线语音合成,由于官网demo是kt语言开发的,咱也看不懂kt,搜遍了全网也没看到一个java版的新版离线语音demo,现记录下,留给有缘人参考!!!!!毕竟咱在这上面遇到了不少的坑。如果能留言指正,那就更好了。第一步:​ 官网注册账号---》实名认证---》点击语音合成---》离线语音......
  • Java中用到的线程调度
    抢占式调度抢占式调度指的是每条线程执行的时间、线程的切换都由系统控制,系统控制指的是在系统某种运行机制下,可能每条线程都分同样的执行时间片,也可能是某些线程执行的时间片较长,甚至某些线程得不到执行的时间片。在这种机制下,一个线程的堵塞不会导致整个进程堵塞。协同式调度协同......
  • Java 9 新特性
    Java9引入了许多新特性和改进,下面是一些Java9的新特性以及相关案例:模块化系统(JavaPlatformModuleSystem,JPMS):Java9引入了一个全新的模块化系统,允许开发者将代码组织成模块,以提高代码的可维护性和可重用性。模块化系统可以帮助开发者解决依赖......
  • Java 8 新特性
    Java8是Java编程语言的一个重要版本,引入了许多更新和改进。Lambda表达式:引入了函数式编程的概念,可以简化代码,提高代码的可读性和可维护性。1//使用Lambda表达式实现一个简单的线程2Threadthread=newThread(()->System.out.println("Hello,Lambda!"......
  • JavaScript-常用字符串方法和属性
    JavaScript-常用字符串方法和属性charAt()//返回指定位置处的字符。charCodeAt()//返回指定位置处字符编码。codePointAt()//返回字符串中索引(位置)处的Unicode值。concat()//返回两个或多个连接的字符串。constructor返回字符串的构造函数。endsWith()//返回......
  • python基础day34 魔术方法和反射
    魔术方法(内置方法)类里面内置的双下划线开头的一线方法,他们具有特殊的功能,我们称之为是魔术方法,简称魔法。eg:__init__魔术方法的学习之需要掌握每个方法什么时候触发或者执行1.__str__,__repr__方法classStudent():def__init__(self,name,age,gender):s......