一、Field类和InvocationTargetException类

InvocationTargetException 是一个经过检查的异常,它包装了被调用的方法或构造函数抛出的异常。Field提供有关类或接口的单个​​字段的信息和动态访问。反射字段可以是类(静态)字段或实例字段。下面我将从源码角度详细介绍Field类和InvocationTargetException类内部源码

二、Field类源码介绍

Field类继承了AccessibleObject类,同时实现了接口Member

public final
class Field extends AccessibleObject implements Member {}

下面定义了一些基本变量

 private Class<?>            clazz;private int                 slot;private String              name;private Class<?>            type;private int                 modifiers;private transient String    signature;private transient FieldRepository genericInfo;private byte[]              annotations;private FieldAccessor fieldAccessor;private FieldAccessor overrideFieldAccessor;private Field               root;

获取泛型签名

private String getGenericSignature() {return signature;}

获取泛型工厂

private GenericsFactory getFactory() {Class<?> c = getDeclaringClass();// create scope and factoryreturn CoreReflectionFactory.make(c, ClassScope.make(c));}

获取字段存储库

private FieldRepository getGenericInfo() {// lazily initialize repository if necessaryif (genericInfo == null) {// create and cache generic info repositorygenericInfo = FieldRepository.make(getGenericSignature(),getFactory());}return genericInfo; //return cached repository}

Field的构造方法

Field(Class<?> declaringClass,String name,Class<?> type,int modifiers,int slot,String signature,byte[] annotations){this.clazz = declaringClass;this.name = name;this.type = type;this.modifiers = modifiers;this.slot = slot;this.signature = signature;this.annotations = annotations;}

包私有例程(通过 ReflectAccess 暴露给 java.lang.Class)返回该字段的副本。 副本的“根”字段指向此字段。

Field copy() {if (this.root != null)throw new IllegalArgumentException("Can not copy a non-root Field");Field res = new Field(clazz, name, type, modifiers, slot, signature, annotations);res.root = this;res.fieldAccessor = fieldAccessor;res.overrideFieldAccessor = overrideFieldAccessor;return res;}

返回表示类或接口的 Class 对象,该类或接口声明了由此 Field 对象表示的字段

public Class<?> getDeclaringClass() {return clazz;}

获取字段名称

public String getName() {return name;}

获取修饰符

public int getModifiers() {return modifiers;}

判断是否是枚举

public boolean isEnumConstant() {return (getModifiers() & Modifier.ENUM) != 0;}

判断是否是合成字段

public boolean isSynthetic() {return Modifier.isSynthetic(getModifiers());}

定义获取类型

public Class<?> getType() {return type;}

获取泛型类型

public Type getGenericType() {if (getGenericSignature() != null)return getGenericInfo().getGenericType();elsereturn getType();}

将此Field与指定的对象进行比较

public boolean equals(Object obj) {if (obj != null && obj instanceof Field) {Field other = (Field)obj;return (getDeclaringClass() == other.getDeclaringClass())&& (getName() == other.getName())&& (getType() == other.getType());}return false;}

获取哈希值

 public int hashCode() {return getDeclaringClass().getName().hashCode() ^ getName().hashCode();}

定义返回描述此Field的字符串

public String toString() {int mod = getModifiers();return (((mod == 0) ? "" : (Modifier.toString(mod) + " "))+ getType().getTypeName() + " "+ getDeclaringClass().getTypeName() + "."+ getName());}

转化为泛型字符串

public String toGenericString() {int mod = getModifiers();Type fieldType = getGenericType();return (((mod == 0) ? "" : (Modifier.toString(mod) + " "))+ fieldType.getTypeName() + " "+ getDeclaringClass().getTypeName() + "."+ getName());}

在指定的对象上返回由此 Field 表示的字段的值。

 public Object get(Object obj)throws IllegalArgumentException, IllegalAccessException{if (!override) {if (!Reflection.quickCheckMemberAccess(clazz, modifiers)) {Class<?> caller = Reflection.getCallerClass();checkAccess(caller, clazz, obj, modifiers);}}return getFieldAccessor(obj).get(obj);}

获取静态或实例布尔字段的值。

public boolean getBoolean(Object obj)throws IllegalArgumentException, IllegalAccessException{if (!override) {if (!Reflection.quickCheckMemberAccess(clazz, modifiers)) {Class<?> caller = Reflection.getCallerClass();checkAccess(caller, clazz, obj, modifiers);}}return getFieldAccessor(obj).getBoolean(obj);}

获取静态或实例字节字段的不同类型的值。

public byte getByte(Object obj)throws IllegalArgumentException, IllegalAccessException{if (!override) {if (!Reflection.quickCheckMemberAccess(clazz, modifiers)) {Class<?> caller = Reflection.getCallerClass();checkAccess(caller, clazz, obj, modifiers);}}return getFieldAccessor(obj).getByte(obj);}
public char getChar(Object obj)throws IllegalArgumentException, IllegalAccessException{if (!override) {if (!Reflection.quickCheckMemberAccess(clazz, modifiers)) {Class<?> caller = Reflection.getCallerClass();checkAccess(caller, clazz, obj, modifiers);}}return getFieldAccessor(obj).getChar(obj);}
public short getShort(Object obj)throws IllegalArgumentException, IllegalAccessException{if (!override) {if (!Reflection.quickCheckMemberAccess(clazz, modifiers)) {Class<?> caller = Reflection.getCallerClass();checkAccess(caller, clazz, obj, modifiers);}}return getFieldAccessor(obj).getShort(obj);}public int getInt(Object obj)throws IllegalArgumentException, IllegalAccessException{if (!override) {if (!Reflection.quickCheckMemberAccess(clazz, modifiers)) {Class<?> caller = Reflection.getCallerClass();checkAccess(caller, clazz, obj, modifiers);}}return getFieldAccessor(obj).getInt(obj);}
public long getLong(Object obj)throws IllegalArgumentException, IllegalAccessException{if (!override) {if (!Reflection.quickCheckMemberAccess(clazz, modifiers)) {Class<?> caller = Reflection.getCallerClass();checkAccess(caller, clazz, obj, modifiers);}}return getFieldAccessor(obj).getLong(obj);}
public float getFloat(Object obj)throws IllegalArgumentException, IllegalAccessException{if (!override) {if (!Reflection.quickCheckMemberAccess(clazz, modifiers)) {Class<?> caller = Reflection.getCallerClass();checkAccess(caller, clazz, obj, modifiers);}}return getFieldAccessor(obj).getFloat(obj);}
public double getDouble(Object obj)throws IllegalArgumentException, IllegalAccessException{if (!override) {if (!Reflection.quickCheckMemberAccess(clazz, modifiers)) {Class<?> caller = Reflection.getCallerClass();checkAccess(caller, clazz, obj, modifiers);}}return getFieldAccessor(obj).getDouble(obj);}

设置某个对象的值。

 public void set(Object obj, Object value)throws IllegalArgumentException, IllegalAccessException{if (!override) {if (!Reflection.quickCheckMemberAccess(clazz, modifiers)) {Class<?> caller = Reflection.getCallerClass();checkAccess(caller, clazz, obj, modifiers);}}getFieldAccessor(obj).set(obj, value);}

设置某个对象的布尔类型

public void setBoolean(Object obj, boolean z)throws IllegalArgumentException, IllegalAccessException{if (!override) {if (!Reflection.quickCheckMemberAccess(clazz, modifiers)) {Class<?> caller = Reflection.getCallerClass();checkAccess(caller, clazz, obj, modifiers);}}getFieldAccessor(obj).setBoolean(obj, z);}

设置某个对象的byte类型字

public void setByte(Object obj, byte b)throws IllegalArgumentException, IllegalAccessException{if (!override) {if (!Reflection.quickCheckMemberAccess(clazz, modifiers)) {Class<?> caller = Reflection.getCallerClass();checkAccess(caller, clazz, obj, modifiers);}}getFieldAccessor(obj).setByte(obj, b);}

设置某个对象的char类型字

 public void setChar(Object obj, char c)throws IllegalArgumentException, IllegalAccessException{if (!override) {if (!Reflection.quickCheckMemberAccess(clazz, modifiers)) {Class<?> caller = Reflection.getCallerClass();checkAccess(caller, clazz, obj, modifiers);}}getFieldAccessor(obj).setChar(obj, c);}

设置某个对象的short类型字

 public void setShort(Object obj, short s)throws IllegalArgumentException, IllegalAccessException{if (!override) {if (!Reflection.quickCheckMemberAccess(clazz, modifiers)) {Class<?> caller = Reflection.getCallerClass();checkAccess(caller, clazz, obj, modifiers);}}getFieldAccessor(obj).setShort(obj, s);}

设置某个对象的int类型字

 public void setInt(Object obj, int i)throws IllegalArgumentException, IllegalAccessException{if (!override) {if (!Reflection.quickCheckMemberAccess(clazz, modifiers)) {Class<?> caller = Reflection.getCallerClass();checkAccess(caller, clazz, obj, modifiers);}}getFieldAccessor(obj).setInt(obj, i);}

设置某个对象的long类型字

 public void setLong(Object obj, long l)throws IllegalArgumentException, IllegalAccessException{if (!override) {if (!Reflection.quickCheckMemberAccess(clazz, modifiers)) {Class<?> caller = Reflection.getCallerClass();checkAccess(caller, clazz, obj, modifiers);}}getFieldAccessor(obj).setLong(obj, l);}

设置某个对象的float类型字

public void setFloat(Object obj, float f)throws IllegalArgumentException, IllegalAccessException{if (!override) {if (!Reflection.quickCheckMemberAccess(clazz, modifiers)) {Class<?> caller = Reflection.getCallerClass();checkAccess(caller, clazz, obj, modifiers);}}getFieldAccessor(obj).setFloat(obj, f);}

设置某个对象的double类型字

public void setDouble(Object obj, double d)throws IllegalArgumentException, IllegalAccessException{if (!override) {if (!Reflection.quickCheckMemberAccess(clazz, modifiers)) {Class<?> caller = Reflection.getCallerClass();checkAccess(caller, clazz, obj, modifiers);}}getFieldAccessor(obj).setDouble(obj, d);}

获取字段地址,中间为具体实现类,最后是对外接口类

private FieldAccessor getFieldAccessor(Object obj)throws IllegalAccessException{boolean ov = override;FieldAccessor a = (ov) ? overrideFieldAccessor : fieldAccessor;return (a != null) ? a : acquireFieldAccessor(ov);}
private FieldAccessor acquireFieldAccessor(boolean overrideFinalCheck) {// First check to see if one has been created yet, and take it// if soFieldAccessor tmp = null;if (root != null) tmp = root.getFieldAccessor(overrideFinalCheck);if (tmp != null) {if (overrideFinalCheck)overrideFieldAccessor = tmp;elsefieldAccessor = tmp;} else {// Otherwise fabricate one and propagate it up to the roottmp = reflectionFactory.newFieldAccessor(this, overrideFinalCheck);setFieldAccessor(tmp, overrideFinalCheck);}return tmp;}
private FieldAccessor getFieldAccessor(boolean overrideFinalCheck) {return (overrideFinalCheck)? overrideFieldAccessor : fieldAccessor;}

设置字段地址

private void setFieldAccessor(FieldAccessor accessor, boolean overrideFinalCheck) {if (overrideFinalCheck)overrideFieldAccessor = accessor;elsefieldAccessor = accessor;// Propagate upif (root != null) {root.setFieldAccessor(accessor, overrideFinalCheck);}}

定于注解类型

public <T extends Annotation> T getAnnotation(Class<T> annotationClass) {Objects.requireNonNull(annotationClass);return annotationClass.cast(declaredAnnotations().get(annotationClass));}

定义获取注解类型

public <T extends Annotation> T[] getAnnotationsByType(Class<T> annotationClass) {Objects.requireNonNull(annotationClass);return AnnotationSupport.getDirectlyAndIndirectlyPresent(declaredAnnotations(), annotationClass);}

返回直接出现在此元素上的注释## 三、InvocationTargetException类源码介绍
InvocationTargetException类

  public Annotation[] getDeclaredAnnotations()  {return AnnotationParser.toArray(declaredAnnotations());}

定义注解泛型和注解键值对

private transient Map<Class<? extends Annotation>, Annotation> declaredAnnotations;

生成泛型-注解键值对

private synchronized  Map<Class<? extends Annotation>, Annotation> declaredAnnotations() {if (declaredAnnotations == null) {Field root = this.root;if (root != null) {declaredAnnotations = root.declaredAnnotations();} else {declaredAnnotations = AnnotationParser.parseAnnotations(annotations,sun.misc.SharedSecrets.getJavaLangAccess().getConstantPool(getDeclaringClass()),getDeclaringClass());}}return declaredAnnotations;}

调用JVM获取注解byte数组

private native byte[] getTypeAnnotationBytes0();

定义获取注解类型对外接口类

public AnnotatedType getAnnotatedType() {return TypeAnnotationParser.buildAnnotatedType(getTypeAnnotationBytes0(),sun.misc.SharedSecrets.getJavaLangAccess().getConstantPool(getDeclaringClass()),this,getDeclaringClass(),getGenericType(),TypeAnnotation.TypeAnnotationTarget.FIELD);
}

三、InvocationTargetException类

InvocationTargetException类继承了ReflectiveOperationException类

public class InvocationTargetException extends ReflectiveOperationException {}

下面定义了通用串行ID

private static final long serialVersionUID = 4085088731926701167L;

返回目标

private Throwable target;

构造一个以 null 作为目标异常的 InvocationTargetException。

protected InvocationTargetException() {super((Throwable)null);

构造一个带有目标异常的 InvocationTargetException。

public InvocationTargetException(Throwable target) {super((Throwable)null);  // Disallow initCausethis.target = target;}

构造一个带有目标异常和详细消息的 InvocationTargetException

public InvocationTargetException(Throwable target, String s) {super(s, null);  // Disallow initCausethis.target = target;}

获取抛出的目标异常

public Throwable getTargetException() {return target;}

返回此异常的原因(抛出的目标异常,可能为null

public Throwable getCause() {return target;}

超详细的逐句介绍Java反射之Field类和InvocationTargetException类函数源码讲解(全)相关推荐

  1. 超详细的逐句介绍Java网络编程之Socket类函数源码讲解(全)

    一.Socket类 Socket 类表示通信双方中的客户端,用于呼叫远端机器上的一个端口,主动向服务器端发送数据(当连接建立后也能接收数据).下面我将从源码的角度来介绍Socket类的内部原理及其方法 ...

  2. java 克隆对象工具类_关于dorado-core源码包中CloneUtils克隆工具类对对象进行克隆复制操作...

    一.前言 基于dorado.core.jar开源包中的com.bstek.dorado.util.CloneUtils克隆工具类,对对象进行通过java.lang.reflect.Method映射克隆 ...

  3. 超详细的AD8031ARZ介绍,就在这里

    2019独角兽企业重金招聘Python工程师标准>>> 超详细的AD8031ARZ介绍,就在这里 放大器类型:电压反馈 电路数:1 输出类型:满摆幅 压摆率:35 V/μs -3db ...

  4. Swig超详细入门教程(Java调用C/C++, CMake)——更新于2021.12

    目录 相关教程 环境配置 0基础上手例子(C/C++) 使用CMake的例子(C语言) 使用CMake的例子(C++) 本文主要是手把手教萌新们如何用官方用例构建(有许多本人亲身踩坑血泪史) 相关教程 ...

  5. java 反射获取实体类_Java 通过反射给实体类赋值操作

    表单提交这个方法是挺方便的,但在java来说就显得有些麻烦了, 怎么个麻烦呢,就是当你字段多的时候,你就得一个一个的获取其对应的值,这样代码量就多了起来,其代码量不说,维护也是一个问题. 所以就有了这 ...

  6. Java 反射机制[Field反射]

    Java 反射机制[Field反射] 1.  反射概念及功能 反射就是把Java类中的各种成分映射成对应的Java类.比如一个Java类中用一个Class类的对象来表示. 一个类中的组成部分分为成员变 ...

  7. java反射的field.get(null)

    转载自  java反射的field.get(null) 在java的反射中,通过字段获取对象,是通过 public Object get(Object obj) 字段不是静态字段的话,要传入反射类的对 ...

  8. 利用Java反射机制调用类的私有方法

    利用Java反射机制调用类的私有方法 引言 来吧·展示 参考链接 引言 如何调用其他类的私有方法呢? 可以利用Java的反射机制,去调用其他类的私有方法 来吧·展示 package cn.learn. ...

  9. java反射之Field用法(获取对象的字段名和属性值)

    一.概述 Field是一个类,位于java.lang.reflect包下.在Java反射中Field类描述的是类的属性信息,功能包括: 获取当前对象的成员变量的类型 对成员变量重新设值 二.如何获取F ...

最新文章

  1. 设计模式之八大设计原则
  2. python做平面设计有前途吗_现在学平面设计还有发展前景吗?
  3. ifix如何设画面大小_如何让你的视频又小又清晰?视频编码输出软件来了
  4. socket实现一个简单的echo服务
  5. CAD转换图片的小窍门
  6. 黑客攻防与电脑安全-从新手到高手
  7. 微信开放平台和微信公众平台配置流程简介,
  8. DSM到DTM的转换——基于PCI Geomatica
  9. 流量+安全 平安WiFi卡位入口战略
  10. 利用easyX图形库画迷宫问题的路径
  11. HOG+SVM实现行人检测
  12. 带你入门NoSQL(真的是太全了)
  13. 田中耕一:一个奇怪的诺贝尔奖获得者
  14. Sallen-Key 有源滤波器-ONE
  15. 雨润oa系统服务器 e-mobile,泛微OA系统e-mobile让办公更安全
  16. 中国台湾内存制造商威刚遭勒索攻击
  17. Flink Caused by:org.apache.flink.streaming.connectors.kafka.internal.Handover$ClosedException
  18. 身份证过期了能参加计算机二级考试吗
  19. 廖雪峰博客高阶函数的答案
  20. 信息安全保护轮廓和安全目标 引 言

热门文章

  1. 在Spring MVC REST应用程序中自动生成WADL
  2. 编个程序来计算怎么还房贷最合适
  3. OCR文字识别:Tesseract-4.00训练字库
  4. Android px density densityDpi dp 之间的关系和区别
  5. Task03 召回模型:YoutubeDNN、DSSM
  6. SoundTouch为声音添加特效(soundstretch)
  7. 我和媳妇儿欠了几万网贷,工资加起来才一万,看不到未来,怎么办?
  8. JVM运行原理及优化之 jstat -gc
  9. 推导:通过均匀分布来产生任意分布随机数
  10. 春暖花开,给自己多一点甜蜜的关爱丨钛空舱