笔记 - Java 反射

简介: 通过Java反射,可以实现以下功能:     > 在运行时判断任意一个对象所属的类     > 在运行时构造任意一个类的对象     > 在运行时判断任意一个类所具有的方法和属性     > 在运行时调用任意一个对象的方法 反射常用API:     > Class类:反射的核心类,反射所有的操作都是围绕该类来生成的,通过Class类,可以获取类的属
通过Java反射,可以实现以下功能:
    > 在运行时判断任意一个对象所属的类
    > 在运行时构造任意一个类的对象
    > 在运行时判断任意一个类所具有的方法和属性
    > 在运行时调用任意一个对象的方法

反射常用API:
    > Class类:反射的核心类,反射所有的操作都是围绕该类来生成的,通过Class类,可以获取类的属性,方法等内容信息。
    > Field类:表示该类的属性(字段),可以获取和设置类中属性的值。
    > Method类:表示类的方法,它可以用来获取类中方法的信息,或者执行方法。
    > Constructor类:表示该类的构造方法。

使用反射的基本步骤:
    > 导入java.lang.reflect.*;包;
    > 获得需要操作的类的java.lang.Class对象;
    > 调用Class的方法获取Field、Method等对象;
    > 使用反射API进行操作。

获取Class对象的三种方式:
    > 调用对象的getClass()方法
            Student s = new Student();
            Class c = s.getClass();
    > 调用类的class属性
            Class c = Student.class;
    > 使用Class类的forName()静态方法
            Class c = Class.forName("com.arvin.bean.Student");
            括号中的类名称必须是带完整包名的类名称!!! 否则将抛出ClassNotFoundException

Constructor的使用:
    > 通过Class对象的getConstructor(Class<T>... parameterTypes)来获得一个Constructor对象
        > parameterTypes:需要被获取的构造方法的参数列表类型对象的Class对象
    > 调用Constructor对象的newInstance(Object... initArgs)方法创建一个对应的对象
        > initArgs:对象初始化时需要传入的参数
            
Field的使用:
    > 通过Class对象的getDeclaredField(String fieldName)可以获取任何访问级别的属性,得到Field对象
        Field field = c.getDeclaredField("name");
    
    > 若第一步获取的属性在当前类中无访问权限,则需要设置通过反射访问时取消权限检查
        field.setAccessible(true);
         > true:表示运行时不检查权限
         > false:表示运行时要检查权限
        
    > 对filed对象进行赋值或者取值。setXxx(Object obj, Object value), getXxx(Object obj);
        > 参数obj:应该修改其字段的对象
        > value:要修改的值

Method的使用:
    > 通过Class对象的getMethod(String methodName, Class<T>... parameterType)方法类获取一个Method对象
        > methodName:需要获取的方法的方法名字符串
        > parameterType:需要获取的方法的参数列表类型的Class对象
        
    > 调用方法,通过Method对象的invoke(Object obj, Object... args)方法来执行
        > obj:从中调用底层方法的对象
        > args:被调用的方法的参数列表
        
!!!!!!!
注意:
    使用反射虽然会很大程度上提高代码的灵活性,但是不能滥用反射,因为通过反射创建对象时性能要稍微低一些。
实际上,只有当程序需要动态创建某个类的对象时才会考虑使用反射,通常在开发通用性比较广的框架,基础平台是肯能会大量使用反射,
因为在很多Java框架中都需要根据配置文件信息来创建Java对象,从配置文件读取的只是某个类的字符串类名,程序需要根据字符串来创建
对应的实例,就必须使用反射。
    在实际开发中,没有必要使用反射来访问已知类的方法和属性,只有当程序需要动态创建某个类的对象的时候才会考虑使用
   
目录
相关文章
|
12天前
|
Java 开发工具 Android开发
Kotlin语法笔记(26) -Kotlin 与 Java 共存(1)
本系列教程笔记详细讲解了Kotlin语法,适合需要深入了解Kotlin的开发者。若需快速学习Kotlin,建议查看“简洁”系列教程。本期重点介绍了Kotlin与Java的共存方式,包括属性、单例对象、默认参数方法、包方法、扩展方法以及内部类和成员的互操作性。通过这些内容,帮助你在项目中更好地结合使用这两种语言。
27 1
|
14天前
|
Java 开发工具 Android开发
Kotlin语法笔记(26) -Kotlin 与 Java 共存(1)
Kotlin语法笔记(26) -Kotlin 与 Java 共存(1)
26 2
|
3天前
|
安全 Java 编译器
Kotlin教程笔记(27) -Kotlin 与 Java 共存(二)
Kotlin教程笔记(27) -Kotlin 与 Java 共存(二)
|
3天前
|
Java 开发工具 Android开发
Kotlin教程笔记(26) -Kotlin 与 Java 共存(一)
Kotlin教程笔记(26) -Kotlin 与 Java 共存(一)
|
3天前
|
Java 编译器 Android开发
Kotlin教程笔记(28) -Kotlin 与 Java 混编
Kotlin教程笔记(28) -Kotlin 与 Java 混编
|
11天前
|
存储 Java
[Java]反射
本文详细介绍了Java反射机制的基本概念、使用方法及其注意事项。首先解释了反射的定义和类加载过程,接着通过具体示例展示了如何使用反射获取和操作类的构造方法、方法和变量。文章还讨论了反射在类加载、内部类、父类成员访问等方面的特殊行为,并提供了通过反射跳过泛型检查的示例。最后,简要介绍了字面量和符号引用的概念。全文旨在帮助读者深入理解反射机制及其应用场景。
11 0
[Java]反射
|
12天前
|
Java 编译器 Android开发
Kotlin语法笔记(28) -Kotlin 与 Java 混编
本系列教程详细讲解了Kotlin语法,适合需要深入了解Kotlin的开发者。对于希望快速学习Kotlin的用户,推荐查看“简洁”系列教程。本文档重点介绍了Kotlin与Java混编的技巧,包括代码转换、类调用、ProGuard问题、Android library开发建议以及在Kotlin和Java之间互相调用的方法。
13 1
|
12天前
|
安全 Java 编译器
Kotlin语法笔记(27) -Kotlin 与 Java 共存(二)
本教程详细讲解Kotlin语法,适合希望深入了解Kotlin的开发者。若需快速入门,建议查阅“简洁”系列教程。本文重点探讨Kotlin与Java共存的高级话题,包括属性访问、空安全、泛型处理、同步机制及SAM转换等,助你在项目中逐步引入Kotlin。
13 1
|
14天前
|
Java 编译器 Android开发
Kotlin语法笔记(28) -Kotlin 与 Java 混编
Kotlin语法笔记(28) -Kotlin 与 Java 混编
18 2
|
20天前
|
Java 数据库连接 编译器
Kotlin教程笔记(29) -Kotlin 兼容 Java 遇到的最大的“坑”
Kotlin教程笔记(29) -Kotlin 兼容 Java 遇到的最大的“坑”