美文网首页
Java 反射入门

Java 反射入门

作者: 一个追寻者的故事 | 来源:发表于2020-04-15 10:32 被阅读0次
定义

Java的反射(reflection)机制是指在程序的运行状态中,可以构造任何一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用任意一个对象的属性和方法。这种动态获取程序信息以及动态调用对象的功能称为 Java语言的反射机制

功能

Java 反射机制主要提供了以下功能:
1、在 运行时 判断任意一个对象所属的类;
2、在 运行时 构造任意一个类的对象;
3、在 运行时 判断任意一个类所具有的成员变量和方法;
4、在 运行时 调用任意一个对象的方法;

换句话说。Java程序可以加载一个 运行时 才得知名称的 class,获悉其完整构造(但不包括methods定义),并生成其 对象实体、或对其 fields 设值、或 唤起其 methods

很多类在开发阶段是没有的,在编译等阶段,通过一定技术动态生成,这种情况下,要调用生成类的相关方法等操作时,通过反射是个很好的方法。

本文会从具体细节谈到 java.lang.Class,以及 java.lang.reflect中的 MethodFieldConstructorParameter等内容。

Class类

对于一个字节码文件 .class,虽然表面上我们对该字节码文件一无所知,但该文件本身却记录了许多信息。Java在将.class字节码文件 载入内存时,JVM将产生一个 java.lang.Class对象代表该 .class文件,从该 Class 对象中可以获得类的许多基本信息,这就是反射机制。所以想完成反射操作,就必须首先认识 Class

  • 获得类相关的方法
方法 用途
getClasses() 返回一个数组,数组中包含该类中所有公共类 和 接口 类对象
getDeclaredClasses() 返回一个数组,数组中包含该类中所有类 和 接口 类对象
forName(String className) 根据类名返回类的对象
getName() 获取类的完整路径名字
newInstance() 获得类的实例
getPackage() 获得类的包
getSimpleName() 获得类的包
getSuperclass() 获得当前类集成的父类
getInterfaces() 获得当前类、接口实现的 接口
/**
  Determines the interfaces implemented by the class or interface represented by this object.
  If this object represents a class or interface that implements no interfaces, 
 the method returns an array of length 0.
*/
public Class<?>[] getInterfaces() 
  • 获得类中属性相关的方法
方法 用途
getField(String name) 获得某个公有属性对象
getFields() 获得所有共有的属性对象
getDeclaredField(String name) 获得某个属性对象
getDeclaredFields() 获得所有属性对象
  • 获得类中注解相关的方法
方法 用途
getAnnotation(Class<A> annotationClass) 获得该类中与参数类型匹配的公有注解对象
getAnnotations() 获得该类中所有的公有注解对象
getDeclaredAnnotation(Class<A> annotationClass) 获得该类中与参数类型匹配的所有注解对象
getDeclaredAnnotations() 获得该类中所有的注解对象
  • 获得类中构造器相关的方法
方法 用途
getConstructor(Class<?>... parameterTypes)) 获得该类中与参数类型匹配的公有构造方法
getConstructors() 获得该类的所有公有构造方法
getDeclaredConstructor(Class<?>... parameterTypes) 获得该类中与参数类型匹配的构造方法
getDeclaredConstructors() 获得该类所有构造方法
  • 获得类中方法相关的方法
方法 用途
getMethod(String name, Class...<?> parameterTypes) 获得该类中某个公有的方法
getMethods() 获得该类所有公有的方法
getDeclaredMethod(String name, Class...<?> parameterTypes) 获得该类某个方法
getDeclaredMethods() 获得该类所有方法
  • 类中其它重要的方法
方法 用途
isAnnotation() 如果是注解类型返回true
isAnonymousClass() 匿名类返回true
isEnum() 枚举返回true
isInstance(Object obj) 如果obj是该类的实例则返回true
isInterface() 如果是接口类返回true
isLocalClass() 如果是局部类返回true
isMemberClass() 如果是内部类返回true

获得 Class 对象的三种方式:
1、类.class 例如:Class clazz = String.class
2、Class.forName() 例如:Class clazz = Class.forName("com.lang.String");
3、实例.getClass();

Field类

Field 代表类的成员变量

方法 用途
equals(Object obj) 属性与obj相等则返回true
get(Object obj) 获取obj中对应的属性值
set(Object obj,Object value) 设置obj中的对应属性值
Method类

Method 代表类的方法

方法 用途
invoke(Object obj, Object... args) 传递obj对象以及参数调用该对象对应的方法
Constructor类
方法 用途
newInstance(Object... initargs) 根据传递的参数创建类的对象
总结

本文介绍了 反射的概念,以及反射能干什么事。以及在使用过程中一些常用的、重要的一些类及其方法,更多的信息和用法需要在使用过程中查看API及文档。

参考:
https://baike.baidu.com/item/JAVA反射机制/6015990
https://www.jianshu.com/p/9be58ee20dee

相关文章

网友评论

      本文标题:Java 反射入门

      本文链接:https://www.haomeiwen.com/subject/meaxvhtx.html