码迷,mamicode.com
首页 > 编程语言 > 详细

Java中的反射

时间:2018-04-13 11:08:35      阅读:217      评论:0      收藏:0      [点我收藏+]

标签:父类   接下来   float   框架   for   实现类   两种   ==   它的   

一:反射的概述

  反射是框架设计的灵魂,使用前必须先得到代表的字节码的Class,Class类用于表示.class文件(字节码)。

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

 

二:反射的入口:java.lang.Class

日常开发中的对象,分为两种,基本类型和引用类型:

  • 基本类型,(固定的 8 种) 
    • 整数:byte, short, int, long
    • 小数:float, double
    • 字符:char
    • 布尔值:boolean
  • 引用类型 
    • 所有的引用类型都继承自 java.lang.Object
    • 类,枚举,数组,接口都是引用类型
    • java.io.Serializable 接口,基本类型的包装类(比如 java.lang.Double)也是引用类型

对每一种对象,JVM 都会实例化一个 java.lang.Class 的实例,java.lang.Class 为我们提供了在运行时访问对象的属性和类型信息的能力。Class 还提供了创建新的类和对象的能力。最重要的是,Class 是调用其他反射 API 的入口,我们必须先获得一个 Class 实例才可以进行接下来的操作。

 

(1)、一个类里都有什么

 类名、类修饰符、包信息、父类、实现的接口、属性、方法、构造器(构造方法)、注解多部分组成。

(2)、属性有几部分组成

 修饰符、类型、属性名、属性值四部分组成。

(3)、方法有几部分组成
 
 修饰符、返回类型、方法名、参数列表、方法体、返回值

(4)、构造器几部分组成
 
 修饰符、构造器名称(类名)、参数列表、方法体

 

三:获得入口:java.lang.Class

1.Object.getClass 方法

如果我们已经拿到了一个对象,可以很方便地使用它的 getClass 方法获得一个 Class 对象(当然这仅限于引用类型的对象):

Class strClass = "String".getClass();

  返回的对象 strClass是 String 类型。

 

2. .class 语法

  如果我们当前没有某个类的对象,无法使用 getClass() 方法,那还可以使用另外一种方法获取 Class:在要获得的类名后加上 .class ,比如这样:

Integer.class.newInstance();
int.class.newInstance();

可以看到,这种方式不仅能用于引用类型,基本类型也可以。

 

3.Class.forName()

  如果我们有一个类的完整路径,就可以使用 Class.forName(“类完整的路径”) 来得到相应的 Class,这个方法只能用于引用类型,比如:

Class<?> c = Class.forName("java.lang.String");
Class<?> aClass = Class.forName("com.ws.learn.Test");

 

4. 所有方法一览

技术分享图片

 

四:从Class中获取成员信息

java.lang.reflect.Member 是一个接口,代表 Class 的成员,每个成员都有类型,分为是否从父类继承,还有是否可以直接访问。

Member 有三个实现类:

  • java.lang.reflect.Constructor:表示该 Class 的构造函数
  • java.lang.reflect.Field:表示该 Class 的成员变量
  • java.lang.reflect.Method:表示该 Class 的成员方法

 

获取构造函数

java.lang.Class 提供了以下方法用于获取该类的构造函数:

技术分享图片

注意:构造函数无法从父类继承

Constructor getConstructor(Class[] params)根据构造函数的参数,返回一个具体的具有public属性的构造函数

Constructor getConstructors()     返回所有具有public属性的构造函数数组

Constructor getDeclaredConstructor(Class[] params)     根据构造函数的参数,返回一个具体的构造函数(不分public和非public属性)

Constructor getDeclaredConstructors()    返回该类中所有的构造函数数组(不分public和非public属性)

 

 

获取成员变量

java.lang.Class 提供了以下方法用于获取该类的成员变量:

技术分享图片

Field getField(String name)  根据变量名,返回一个具体的具有public属性的成员变量

Field[] getFields()  返回具有public属性的成员变量的数组

Field getDeclaredField(String name) 根据变量名,返回一个成员变量(不分public和非public属性)

Field[] getDelcaredFields() 返回所有成员变量组成的数组(不分public和非public属性)

 

获取成员方法

java.lang.Class 提供了以下方法用于获取该类的成员方法:

技术分享图片

Method getMethod(String name, Class[] params) 根据方法名和参数,返回一个具体的具有public属性的方法

Method[] getMethods() 返回所有具有public属性的方法数组

Method getDeclaredMethod(String name, Class[] params)  根据方法名和参数,返回一个具体的方法(不分public和非public属性)

Method[] getDeclaredMethods() 返回该类中的所有的方法数组(不分public和非public属性)

 

Java中的反射

标签:父类   接下来   float   框架   for   实现类   两种   ==   它的   

原文地址:https://www.cnblogs.com/fdzfd/p/8818192.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!