当前位置: 首页 > article >正文

Java 反射 java.lang.reflect包


关键一:包java.lang.reflect

在java的java.lang.reflect包中提供了对该功能的支持。
我可以查看java.lang.reflect包,可以看到下面几个关键的类:

关键类说明
Constructor-构造类This class represents a constructor.
Field-属性类This class represents a field.
Method-方法类This class represents a method.
Modifier-修饰符类This class provides static methods to decode class and member modifiers.

关键二:类java.lang.Class

而reflect的源头是java.lang.Class类,Class类是reflect的总导演,所有java类都继承Object类,在Object类中有getClass()方法,该方法返回一个类型为Class的对象。如代码:

Class c = persion.getClass();//persion为类Persion的一个对象
  • 1
  • 1

java.lang.Class类的几个关键方法:

关键方法说明
getPackage()返回包的路径
getName()返回类的名称
getSuperclass()返回父类
getInterfaces()返回其实现的接口
getConstructors()返回其所有的public构造方法
getConstructors(Class… parameterTypes)返回其指定参数的public构造方法
getDeclaredConstructors()返回其所有声明的构造方法,包括private构造方法
getDeclaredConstructors(Class… parameterTypes)返回其指定参数的构造方法,包括private构造方法
getMethods()返回其所有的public的方法,包括其父类的public方法
getMethod(String name, Class… parameterTypes)返回其指定的public的方法
getDeclaredFields()返回其声明的所有的方法,包括private类型的方法
getDeclaredMethod(String name, Class… parameterTypes)返回其指定参数的方法,包括private类型的方法
getFields()返回其所有的public属性,包括其父类的public属性
getField(String name)返回其指定的public属性,包括其父类的public属性
getDeclaredFields()返回其声明的所有的属性,包括其private类型的属性
getDeclaredField(String name)返回其指定的属性,包括其private类型的属性
getClasses()返回其public的内部类
getDeclaredClasses()返回其所有的内部类,包括private类型的内部类

关键三:类Constructor

—–java.lang.reflect.Constructor
访问指定的构造方法,需要根据该构造方法的入口参数的类型来访问。如:

c.getDeclaredConstructor(String.class,int.class);
c.getDeclaredConstructor(new Class[]{String.class,int.class});
  • 1
  • 2
  • 1
  • 2

Constructor类的常用方法:

关键方法说明
isVarArgs()查看该构造方法是否带有可变数量的参数
getParameterTypes()返回构造方法的参数列表
getExceptionTypes()返回构造方法的异常列表
newInstance(Object… args)返回该构造方法创建的类的对象
setAccessible(boolean flag)让private类型的构造方法可以创建类的对象
getModifiers()返回构造方法的类型

关键四:类Field

—–java.lang.reflect.Field
访问指定的属性,需要根据该属性的名称来访问。如:

c.getDeclaredField("name_field");

Field类的常用方法:

关键方法说明
getName()返回成员变量的名称
getType()返回成员变量的类型
get(Object object)返回指定对象object的成员变量的值
set(Object object, Object value)给指定对象object的成员变量设置value值
setAccessible(boolean flag)让private类型的成员变量拥有public权限
getModifiers()返回成员变量的类型

关键五:类Method

—– java.lang.reflect.Method
访问指定的方法,需要根据该方法的名称和入口参数的类型来访问。如:

c.getDeclaredMethod("method_name",String.class,int.class);
c.getDeclaredMethod("method_name",new Class[]{String.class,int.class});1
  • 2

Method类的常用方法:

关键方法说明
getName()返回该方法的名称
getParameterTypes()返回方法的参数列表
getReturnType()返回该方法的返回值类型
getExceptionTypes()返回方法的异常列表
getModifiers()返回方法的类型
isVarArgs()查看该方法是否带有可变数量的参数
invoke(Object receiver, Object… args)用入口参数来调用指定对象的方法
setAccessible(boolean flag)让private类型的方法拥有public权限

reflect的作用

  • 在运行时判断任意一个对象所属的类
  • 在运行时构造任意一个类的对象
  • 在运行时判断任意一个类的完整结构
    如属性,方法,构造方法,父类等等
  • 在运行时调用任意一个类的对象的属性和方法
  • 生成动态代理

reflect的详细使用指南

创建对应的Class实例

java.lang.Class 反射的源头,反射涉及到的类都在java.lang.reflect目录下,如Field,Method,ConstructorType等等。
实例化Class的方法(4种方法):

  • 调用运行时类的.class属性
c = Persion.class;
System.out.println("方法一 : 调用运行时类的.class属性: "+c.toString());
  • 通过运行时类的对象,调用getClass()方法
c = persion.getClass();
System.out.println("方法二 : 通过运行时类的对象,调用getClass()方法: "+c.toString());
  • 调用Class的静态方法forName(String className)
c = Class.forName(Persion.class.getName().toString());
System.out.println("方法三 : 调用Class的静态方法forName(String className): "+c.toString());
  • 通过类的加载器
//ClassLoader classLoader = this.getClass().getClassLoader();
ClassLoader classLoader = Persion.class.getClassLoader();
c = classLoader.loadClass(className);
System.out.println("方法四:通过类的加载器: "+c.toString());

有了Class实例之后,可以做什么?

  • 可以创建对应的运行时类的对象
    方法一:调用Class的newInstance方法
    方法二:调用指定的构造器创建运行时类的对象
  • 可以获取对应的运行时类的完整结构
    如属性,方法,构造方法,包,父类,接口,内部类等等
  • 可以调用对应的运行时类的指定结构
    (如指定的属性,方法,构造方法)
  • 动态代码
    反射的应用,体会反射的动态性。

http://www.lryc.cn/news/2414355.html

相关文章:

  • Hive--数据抽样的常用三种方法(随机/数据块/分桶)
  • 【echarts】使用心得之ChinaMap
  • DL2-TensorFlow2.0编程基础
  • NetBeans配置Tomcat
  • 中国排名前100的IT公司
  • SVN入门教程
  • [转]Centos5 下安装/配置lvm使用reiserfs文件系统
  • 北京公安局出入境管理处地址
  • Spring配置文件applicationContext.xml中bean>>property>>name属性的含义
  • Android和JXTA协议模型的无线D2D通信技术
  • MFC控件(四)(图像列表控件CImageList)
  • 「Linux」- 平均负载(Load Average) @20210210
  • IOS 时区日期处理及定时 (NSDate,NSCalendar,NSTimer,NSTimeZone)
  • 树莓派5串口通信
  • java trimleft_js String.prototype.trim字符去前后空格的扩展
  • Python教程:老师傅带你爬取全网妹子图!
  • vbs格式编程教程基础
  • Struts2框架漏洞总结与复现(下)
  • gbk编码在线转换工具_免费在线PDF转换小工具,让你工作效率提高90%
  • 运维堡垒机Gate One-学习笔记
  • 从零开始学习Oracle之数据备份与还原
  • 常用时序逻辑电路模块:计数器
  • 新手如何学习c语言? 小马带你入门
  • 【Python】决策树算法 详解版【附完整版示例】
  • 几个文件指针操作的函数
  • 边缘检测:Canny算子
  • 简单html页面代码分享---百度
  • 计算机病毒的基本知识
  • HTML标签及案例超详细笔记
  • Hibernate注解版关联关系映射全解析+案例