Java语法糖--反射

简介: 本文目录1. 反射的概念2. 如何获取类的Class对象3. 通过类的Class对象获取类的属性和方法4. 反射的意义

1. 反射的概念

对于一个人来说,了解自己的能力、本事、特点,对于他去干事创业来说,是很重要的。


同样的,对于一门面向对象的语言来说,了解类(对象其实就是类的实现)本身也是重要的,可以在很多地方帮助程序更好的进行。


那么类/对象本身包含那些内容呢,无非就是类名称;父类;继承的接口;类的属性;类的方法,这些都属于是类的信息。


好的,那么这些信息程序员都知道啊,类的信息在定义类的时候不是都写的明明白白的吗。但是反射的意义却是:在程序跑起来之后可以使用代码去获取类的信息。这个,没有反射可办不到。


Java是面向对象的,所有的东西都是有类别的。所以哦,类的信息也是一种类型(就像用户信息可以用UserInfo类描述),类的信息对应的Java类为Class类,注意不是关键字class哈。


举个最常见的栗子:


public class ClassDemo {

public static void main(String[] args) {

 try {

  Class mysqlDriver=Class.forName("com.mysql.jdbc.Driver");

 } catch (ClassNotFoundException e) {

  e.printStackTrace();

 }

}

}

1

2

3

4

5

6

7

8

9

这里Class.forName很明显是Class类的一个static方法,这个方法的意思就是按类名(完整的带包路径的类名)返回类对应的Class对象。因为forName的参数是可以随便写的嘛,所以会抛出一个ClassNotFoundException。


Class.forName方法是在程序运行时按类名称获取类的信息的方法,这就是反射机制。


2. 如何获取类的Class对象

我们定义一个普通类Student,可以有三种方式获取到Student的类型信息:

package temp;
public class Student {
  String studentName;
  public String getStudentName(){
    return studentName;
  }
  public static void main(String[] args) throws ClassNotFoundException {
    //方式1 利用类名称
    Class class1 = Class.forName("temp.Student");  
    //方式2 利用类
    Class class2=Student.class;
    //方式3 利用对象
    Student student=new Student();
    Class class3=student.getClass();
  }
}

3. 通过类的Class对象获取类的属性和方法

获取到Class(类的类型)之后,再获取属性和方法就简单了,直接使用Class类封装的方法即可。


getDeclaredFields():获取类属性

getDeclaredMethods():获取类方法

1

2

使用一个完整的程序演示如下:

package temp;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class Student {
  String studentName;
  public String getStudentName(){
    return studentName;
  }
  public static void main(String[] args) throws ClassNotFoundException {
    Class classStu=Student.class;
    Field[] fields = classStu.getDeclaredFields();
    for(Field field:fields){
      System.out.println("属性类型:"+field.getType().getSimpleName()+",属性名称:"+field.getName());
    }
    Method[] methods=classStu.getDeclaredMethods();
    for(Method method:methods){
      System.out.println("方法名称:"+method.getName()+",返回类型"+method.getReturnType());
    }
  }
}

执行结果如下:


属性类型:String,属性名称:studentName

方法名称:main,返回类型void

方法名称:getStudentName,返回类型class java.lang.String

1

2

3

可见,通过Class类封装的方法,可以在程序运行时候直接获取类的信息。


4. 反射的意义

凡是都有正反两个方面,先说不好的消息吧,用了反射,性能肯定是会降低的。注意此处的性能低,并不是说通过反射获取类的信息性能低,因为除了反射也没有啥可以获取类的信息的机制了。


性能低是指通过反射调用方法性能低,看下面的例子,通过反射获取到方法之后,可以将该方法应用到一个对象上实现该对象的方法调用。本来可以直接调用,反射之后再调用肯定效率要低的。


Class classStu=Student.class;

Student student=new Student();

Method methodGet=classStu.getDeclaredMethod("getStudentName");

//可以通过Method类的invoke方法调用类方法,当然必须得提供对象

String name=(String)methodGet.invoke(student);

System.out.println(name);

1

2

3

4

5

6

但是反射的正面意义还是光辉的,首先提供了一种了解类的信息的手段,使程序运行编写、运行更加自由灵活,充满了更多可能性。


简单的想,在将对象转换为json时,键值对的键不就是对象的属性名称么,用反射获取对象的属性名称是多么爽快的事情啊。

相关文章
|
2月前
|
Java Apache Maven
Java百项管理之新闻管理系统 熟悉java语法——大学生作业 有源码!!!可运行!!!
文章提供了使用Apache POI库在Java中创建和读取Excel文件的详细代码示例,包括写入数据到Excel和从Excel读取数据的方法。
65 6
Java百项管理之新闻管理系统 熟悉java语法——大学生作业 有源码!!!可运行!!!
|
2月前
|
Java 开发工具 Android开发
Kotlin语法笔记(26) -Kotlin 与 Java 共存(1)
本系列教程笔记详细讲解了Kotlin语法,适合需要深入了解Kotlin的开发者。若需快速学习Kotlin,建议查看“简洁”系列教程。本期重点介绍了Kotlin与Java的共存方式,包括属性、单例对象、默认参数方法、包方法、扩展方法以及内部类和成员的互操作性。通过这些内容,帮助你在项目中更好地结合使用这两种语言。
53 1
|
2月前
|
Java 开发工具 Android开发
Kotlin语法笔记(26) -Kotlin 与 Java 共存(1)
Kotlin语法笔记(26) -Kotlin 与 Java 共存(1)
39 2
|
2天前
|
Java 数据库连接 Spring
反射-----浅解析(Java)
在java中,我们可以通过反射机制,知道任何一个类的成员变量(成员属性)和成员方法,也可以堆任何一个对象,调用这个对象的任何属性和方法,更进一步我们还可以修改部分信息和。
|
27天前
|
Java
java do while 的语法怎么用?
java do while 的语法怎么用?
39 3
|
1月前
|
监控 Java
Java基础——反射
本文介绍了Java反射机制的基本概念和使用方法,包括`Class`类的使用、动态加载类、获取方法和成员变量信息、方法反射操作、以及通过反射了解集合泛型的本质。同时,文章还探讨了动态代理的概念及其应用,通过实例展示了如何利用动态代理实现面向切面编程(AOP),例如为方法执行添加性能监控。
|
1月前
|
Java
Java的反射
Java的反射。
32 2
|
2月前
|
存储 Java
[Java]反射
本文详细介绍了Java反射机制的基本概念、使用方法及其注意事项。首先解释了反射的定义和类加载过程,接着通过具体示例展示了如何使用反射获取和操作类的构造方法、方法和变量。文章还讨论了反射在类加载、内部类、父类成员访问等方面的特殊行为,并提供了通过反射跳过泛型检查的示例。最后,简要介绍了字面量和符号引用的概念。全文旨在帮助读者深入理解反射机制及其应用场景。
39 0
[Java]反射
|
2月前
|
Java 编译器 Android开发
Kotlin语法笔记(28) -Kotlin 与 Java 混编
本系列教程详细讲解了Kotlin语法,适合需要深入了解Kotlin的开发者。对于希望快速学习Kotlin的用户,推荐查看“简洁”系列教程。本文档重点介绍了Kotlin与Java混编的技巧,包括代码转换、类调用、ProGuard问题、Android library开发建议以及在Kotlin和Java之间互相调用的方法。
35 1
|
2月前
|
安全 Java 编译器
Kotlin语法笔记(27) -Kotlin 与 Java 共存(二)
本教程详细讲解Kotlin语法,适合希望深入了解Kotlin的开发者。若需快速入门,建议查阅“简洁”系列教程。本文重点探讨Kotlin与Java共存的高级话题,包括属性访问、空安全、泛型处理、同步机制及SAM转换等,助你在项目中逐步引入Kotlin。
30 1