在Java反射的包中定义一个接口java.lang.reflect.Member,它有三个实现类java.lang.reflect.Field, java.lang.reflect.Method, and java.lang.reflect.Constructor.同时这三个类的成员对象直接或间接还都继承了AccessibleObject,当类成员是私有的时候,如果我们使用反射来对这些类成员进行修改或调用,需要使用AccessibleObject的setAccessible()方法来绕过默认的Java访问权限检测,来实现对私有成员的使用。根据Java语言规范,类成员是可继承的类组件,包括字段,方法,以及嵌套的类,接口,枚举类型。因为构造器是不可继承的,所以它不是类成员,这与java.lang.reflect.Member.的实现类是有些差别的。

在Class中提供获取类成员的方式有两种,一种获取不同数量类成员,一种根据类成员性质,根据类成员数量的是要么我们获取所有成员列表,要么根据给定参数获取指定的类成员。而根据类成员性质的,则是一种获取类所有公共成员,包括从父类继承而来的,一种则是获取类内声明所有成员,不包含从父类继承,但是包含私有成员。

获取FieldClass API列举成员继承成员私有成员getDeclaredField()XXO

getField()XOX

getDeclaredFields()OXO

getFields()OOX

我们既可以列举类中所有字段,也可以根据已知的名称来获取一个特定的字段,如果该名称字段不存在的话,会抛出NoSuchFieldException异常。1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21public class{

public String s;

public boolean[][] b;

public ArrayList arrayList;

private int i;

private char c;

public static void main(String[] args) throws NoSuchFieldException{

Class fieldSpy = FieldSpy.class;

System.out.println("---------公共字段列表---------------");

Field[] fields = fieldSpy.getFields();

for (Field field : fields) {

System.out.println(field.toGenericString());

}

System.out.println("---------私有字段i---------------");

Field field3 = fieldSpy.getDeclaredField("i");

System.out.println(field3.toGenericString());

}

}

控制台输出———公共字段列表—————

public java.lang.String com.java.reflection.FieldSpy.s

public boolean[][] com.java.reflection.FieldSpy.b

public java.util.ArrayList com.java.reflection.FieldSpy.arrayList

———私有字段i—————

private int com.java.reflection.FieldSpy.i

获取设置Field值

获取Filed对象后,我们可以使用它的get(Object obj)和set(Object obj,Object value)来获取和设置一个申明该字段的对象的字段值,需要注意的是如果该字段为类私有,我们要先通过setAccessible()方法来设置访问权限1

2

3

4

5

6i.setAccessible(true);

FieldSpy fieldSpyInstance = new FieldSpy();

System.out.println(i.get(fieldSpyInstance));

i.set(fieldSpyInstance,25);

System.out.println(i.get(fieldSpyInstance));

控制台输出0

25

方法

获取ConstructorClass API列举成员继承成员私有成员getDeclaredMethod()XXO

getMethod()XOX

getDeclaredMethods()OXO

getMethods()OOX

我们既可以获取类的成员方法列表,也可以根据已知的方法名和参数来获取指定的方法Method对象。当获取指定的方法时,如getMethod(String name, Class>… parameterTypes)我们需要传入两种参数,第一种是方法名,第二种该方法需要的参数,如果该方法的参数是泛型类型的,我们需要传入的是Object.class。1

2

3

4

5

6

7

8

9

10

11Class c = Reader.class;

System.out.println("---------方法声明列表---------------");

Method[] methods = c.getDeclaredMethods();

for (Method method : methods) {

System.out.println(method.toGenericString());

}

System.out.println("---------公共方法read---------------");

Method method = c.getMethod("read");

System.out.println(method.toGenericString());

控制台输出———方法声明列表—————

public boolean java.io.Reader.ready() throws java.io.IOException

public int java.io.Reader.read() throws java.io.IOException

public abstract int java.io.Reader.read(char[],int,int) throws java.io.IOException

public int java.io.Reader.read(char[]) throws java.io.IOException

public int java.io.Reader.read(java.nio.CharBuffer) throws java.io.IOException

public abstract void java.io.Reader.close() throws java.io.IOException

public void java.io.Reader.mark(int) throws java.io.IOException

public boolean java.io.Reader.markSupported()

public void java.io.Reader.reset() throws java.io.IOException

public long java.io.Reader.skip(long) throws java.io.IOException

———公共方法read—————

public int java.io.Reader.read() throws java.io.IOException

调用Method

获取Method对象后,使用它的invoke(Object obj,Object… args)来调用该方法,invoke需要传入一个声明该方法的对象,否则则会抛出IllegalArgumentException异常,后面是一个可变参数,传入该方法所需的实际参数。1

2Method toUpperCase = String.class.getMethod("toUpperCase");

System.out.println(toUpperCase.invoke("hello"));

控制台输出HELLO

这里需要注意的是,当方法是私有方法时,同样需要先设置Method对象访问权限。

构造器

获取ConstructorClass API列举成员私有成员getDeclaredConstructor()XO

getConstructor()XX

getDeclaredConstructors()OO

getConstructors()OX构造器是无法继承的

以获取公开构造器为例,我们既可以列举类中所有构造器,也可以根据构造器的参数来获取特定的一个构造器。1

2

3

4

5

6

7

8

9

10

11

12Class c = ArrayList.class;

Constructor>[] constructors = c.getConstructors();

System.out.println("---------构造方法列表---------------");

for (Constructor> constructor : constructors) {

System.out.println(constructor.toGenericString());

}

System.out.println("----------有参构造(int)--------------");

Constructor constructor = c.getConstructor(int.class);

System.out.printf(constructor.toGenericString());

控制台输出———构造方法列表—————

public java.util.ArrayList(java.util.Collection extends E>)

public java.util.ArrayList()

public java.util.ArrayList(int)

———-有参构造(int)————–

public java.util.ArrayList(int)

利用Constructor初始化对象

我可以通过Constructor对象的newInstance(Object… initargs)来新建一个对象,它接收一个可变参数.需要注意的是Constructor是采用泛型机制的,如果我们没有指定Constructor的泛型参数,初始化一个对象的时候需要进行强制类型转换。1

2

3

4Class c = ArrayList.class;

Constructor constructor = c.getConstructor(int.class);

ArrayList list = constructor.newInstance(10);

java 反射类成员_java 反射(二)类成员相关推荐

  1. java web 初始化方法_Java Web(二) 类的初始化及初始化顺序

    1. 问题点 最近在写单例模式的时候碰到了@Autiwired注解注入为NULL的情况,研究一番,发现是和类的初始化顺序有关.先抛出我的问题: //异步处理 public class AsyncMan ...

  2. Java 反射取类中类_Java反射机制(二):通过反射取得类的结构

    在反射运用过程中,如果你想得到一个类的完整结构,那么就要使用到java.lang.reflect包中的几个类: · Constructor  表示类中的构造方法 · Field  表示类中的属性 · ...

  3. java反射 获取方法_java反射之获取类的信息方法(推荐)

    本文接上文"老生常谈反射之class类的使用(必看篇)",以编写一个用来获取类的信息(成员函数.成员变量.构造函数)的工具类来讲解"反射之获取类的信息" 1.获 ...

  4. java.lang.class对象_Java反射——java.lang.Class 类简介

    Java的基本思想之一是万事万物即对象,类也是一种对象.但是类是什么对象呢?Java中的类是java.lang.Class的实例化对象,这被成为类类型. //java.lang.Class类中的的主要 ...

  5. java反射三种_Java反射

    1.反射获取Class对象的三种方式 反编译 不是自己写的类,也不知道类里面有哪些方法 变量,让你能够使用程序上线了,修改程序但不终止程序的运行--反射 (1)Object类 getClass 方法 ...

  6. java反射的运用_java反射的使用

    java反射的使用 1 什么是反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力. JAVA反射机制是在运行状态中,对于任意一个类,都能够 ...

  7. java映射的概念_Java 反射 概念理解

    文章来源:http://hollischuang.gitee.io/tobetopjavaer/#/basics/java-basic/reflection 反射 反射机制指的是程序在运行时能够获取自 ...

  8. java 反射执行语句_JAVA反射机制

    JAVA反射机制定义: JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的 ...

  9. java反射源码_java反射技术详解附源码

    在学校学习Java时,由于学的不扎实,也没经历过太多实战项目,所以很多重要的知识点瞟一眼就过去了,比如现在要讲的反射,当时直接就忽略掉了,可现在发现很多地方需要反射,不得不重新学习一下,上学欠了太多债 ...

最新文章

  1. 编程能力差,90%输在了这点上!CTO:这样学编程 ,更容易成为高手
  2. 常见CSS两栏式布局
  3. C语言 递归实现辗转相除法 和 辗转相减法
  4. C++确定数字的奇偶校验的算法实现(附完整源码)
  5. Sping : @InitBinder注解
  6. Sublime Text 2删除行尾空格
  7. 程序猿提升自己水平的方法
  8. CCF NOI1041 志愿者选拔
  9. 基于javaweb的大学生助学贷款管理系统项目源代码
  10. 电磁场理论-麦克斯韦方程组
  11. matlab地理数据导入,基于Matlab的栅格地理数据处理-快速入门系列(1)
  12. python画旋转六边形
  13. COMSOL建立简单多面体
  14. node.js基于vue的化妆品销售管理系统的设计与实现毕业设计源码151314
  15. CSU - 2085 手游大佬(天数计算)
  16. 【深度学习】神经网络的学习过程
  17. 深度linux引导安装教程,deepin深度系统安装教程-电脑系统安装手册
  18. 全景拍摄中的全景接片是什么?怎么操作?
  19. OSChina 周二乱弹 ——现在我满眼都是小星星
  20. 打车类app怎么获取司机位置 开发_哈萨克斯坦的“滴滴打车-yandex taxi”有了它城市内任我行...

热门文章

  1. itchat没了咱们还可以用Python的wxpy模块来玩转微信
  2. python文件及异常处理
  3. Ext.data-GroupingStore/JsonStore/SimpleStore
  4. LINQ to DataSet
  5. jquery中AddClass()方法问题
  6. 漫步数理统计三十二——中心极限定理
  7. 深度学习-为什么用激活函数
  8. leetcode - 1223. 掷骰子模拟
  9. selenium的安装
  10. Python赋值与深浅拷贝