Java反射之method,数组与Object关系,泛型参数

深入分析Java反射(三)-泛型 前提# Java反射的API在JavaSE1.7的时候已经基本完善,但是本文编写的时候使用的是Oracle JDK11,因为JDK11对于sun包下的源码也上传了,可以直接通过IDE查看对应的源码和进行Debug。 本文主要介绍反射中一个比较难的问题-泛型。 泛型的简介# 泛型是在2004年JavaSE 5.0(JDK1.5)版本中添加到Java编程语言中的泛型编程工具。泛型的设计是为了应用在Java的类型系统,提供"用类型或者方法操作各种类型的对象从而提供编译期的类型安全功能(原文:a type 阅读详情


1.反射的基石-->Class

1.1.Class类
 一个类被类加载器加载到内存中,占用一片存储区域,这个空间里面的内容就是类的 字节码 .
 不同的类的字节码是不同的,所以它们在内存中的内容是不同的,这一个个的空间可分别用一个个的对象来表示;
 显然可以为这些组织字节码内容的类定义一个类型,它就是Class类型
 
1.2.如何得到各字节码对应的Class类实例对象
 三种方式:
(1)Class cls1=类名.class 相对简单,还是需要明确类名:System.class;
(2)Class cls1=对象.getClass();必须要明确具体的类,并创建对象:new Date().getClass();
(3)Class cls1=Class.forName("完整的类名(带包名)"):Class.forName("java.util.Date")

1.3.九个预定一个Class实例对象
 八个基本类型+void.Class
 Integer.class包装类的字节码

 public static void main(String[] args) throws Exception {
  // TODO Auto-generated method stub
  String str1 = "abc";
  Class cls1 = str1.getClass();
  Class cls2 = String.class;
  Class cls3 = Class.forName("java.lang.String");
  System.out.println(cls1==cls2);
  System.out.println(cls1==cls3);
  
  System.out.println(cls1.isPrimitive());//是否基本类型,String不是基本类型
  System.out.println(int.class.isPrimitive());//true
  System.out.println(int.class==Integer.class);//false,Integer.class是包装类的字节码
  System.out.println(int.class==Integer.TYPE);//true,Integer.TYPE是其基本类型的字节码
  
  //数组类型的Class类型实例对象Class.isArray
  System.out.println(int[].class.isPrimitive());//false
  System.out.println(int[].class.isArray());//true
 }


 

 只要在源程序中出现的类型,都有各自的Class实例对,例如 int[],void 等等;

 

2.反射
 就是把JAVA类中的各种成分反射成为相应的JAVA类

 反射的好处: 大大的增强了程序的扩展性.

3.反射的基本步骤:
(1)获得Class对象,就是获取到指定的名称的字节码文件对象.
(2)实例化对象,获得类的属性/方法或构造函数.
(3)访问属性、调用方法、调用构造函数创建对象.

4.构造方法的反射应用
4.1.得到某个类中所有的构造方法
Constructor  constructors[]= Class.forName("").getConstructors();;

4.2.得到某一个具体的构造方法:用参数定义
Constructor  constructor= Class.forName("").getConstructor(StringBuffer.class);

4.3.用反射构建类的实例:中转作用
(1)class-->constructor-->new object:带参数的Constructor的newInstance()

 String  name="com.dsa.类名";
得到某一个指定构造方法
 onstructor  constructor= Class.forName("").getConstructor(String.class);
创建实例对象
     Object obj=constructor.newInstance("abc");

 通过构造方法的反射来new String(new StringBuffer("abc")):newInstance();
 
/*详细说明:
 //用getConstructor来获取构造方法,用StringBuffer.class反射的SB类定义了构造方法的参数类型,
 Constructor constructor1 = String.class.getConstructor(StringBuffer.class);
 
 //使用Constructor的newInstance创建实例,注意构造参数对象参数保持之前定义的类型;
 //编译期不知道反射过来的对象是String,要加上该类句柄;
 String str2 = (String)constructor1.newInstance(new StringBuffer("abc"));
 
 System.out.println(str2.charAt(2));*/

(2)class-->new object
 如果构造方法不带参数,可以直接用Class.newInstance();

 String  name="com.dsa.类名";

寻找该名称类文件,并加载进内存,并非产生Class对象
 Class cls=Class.forName(name);
用Class的newInstance()产生该类的对象
 Object obj=cls.newInstance();

5.成员变量 Filed类的反射: 代表某个类中的一个成员变量

 ReflectPoint pt1=new ReflectPoint(3,5);
 Field fieldY=pt1.getClass().getField("y");
 System.out.println(fieldY.get(pt1));//get()获得具体对象中的值
 
 Field fieldX=pt1.getClass().getDeclaredField("x");//获得变量不管私有或保护;
 fieldX.setAccessible(true);//暴力反射!
 System.out.println(fieldX.get(pt1));
 
 成员变量的综合应用:
 changeStringValue(pt1);
 System.out.println(pt1);

private static void changeStringValue(Object obj) throws Exception {
 Field[] fields=obj.getClass().getFields();//获得obj的所有变量
 for(Field field: fields){
//  if(field.getType().equals(String.class))//都是字节码用==;
  if(field.getType()== String.class){
   String oldValue = (String)field.get(obj);
   String newValue = oldValue.replace('b', 'a');//用a替换b;
   field.set(obj, newValue);//两个对象交换;
  }
 }
 
}


 

6.成员方法的反射 Method
反射形式:
(1)获取Method字节码:Class.getMethod("方法名",参数字节码)//参数字节码可为空null
(2)反射取方法:invoke(对象名,参数)//对象名为null表示静态方法
 
6.1.String类的charAt()方法示例:
 
 Method  methodCharAt = String.class.getMethod("charAt",int.class);
    System.out.println(methodCharAt.invoke(str1,1));
    System.out.println(methodCharAt.invoke(str1, new Object[]{2}));//jdk1.4

6.2.对接收数组参数的成员方法进行反射:main方法演示

 String startingClassName= args[0];//在run对话框中植入TestArguments给args[0]
 Method mainMethod= Class.forName(startingClassName).getMethod("main",String[].class);
 mainMethod.invoke(null, new Object[]{new String[]{"111","222","333"}});
 

 class TestArguments{
  public static void main(String[] args){
   for(String arg: args){
    System.out.println(arg);
   }
  }
 }


 

7.数组与Object的关系及其反射类型

Arrays.asList(int[])和String[]的差异:因为兼容jdk1.4,String可以上溯Object的关系.

 Object aObj1=a1;
 Object aObj2=a4;
 //Object[]aObj3=a1;//一维数组不能转为Object;
 Object aObj4=a3;
 Object aObj5=a4;
 
 System.out.println(a1);
 System.out.println(a4);
 System.out.println(Arrays.asList(a1));//int类集合不能打出
 System.out.println(Arrays.asList(a4));//String集合可以直接打出
 
8.数组的反射应用:当Class isArray()
示例:(对比Field的应用)

 private static void printObject(Object obj) {
 Class clazz=obj.getClass();
 if(clazz.isArray()){
  int len = Array.getLength(obj);
  for(int i=0;i<len;i++){
   System.out.println(Array.get(obj,i));
  }
 }else{
  System.out.println(obj);
 }
 
}


 

9.通过反射获得泛型的实际类型参数

9.1.通过指定对应的Class对象,程序可以获得该类里面所有的Field,获得Field对象f后都可以使用getType()来获取其类型.
 Class<?> type = f.getType();//获得字段的类型

 但此方法只对普通Field有效,若该Field有泛型修饰,则不能准确得到该Field的泛型参数,如Map<String,Integer>;
 
反射获得指定Field的泛型类型步骤:
(1)获取当前Class类-->泛型类Field;
 
(2)用getGenericType(),得到泛型类型:
  Type gType = f.getGenericType();
(3)将Type对象强转为子类ParameterizedType:
 
(4)使用getRawType()获得泛型类型,使用getActualTypeArguments()获得参数类型;
  Type getRawType()//返回被泛型限制的类型;
  Type[]  getActualTypeArguments()//返回泛型参数类型;

示例:

import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.HashMap;
import java.util.Map;

public class GetGenericTypeDemo {
 Map<String,Integer> map = new HashMap<String,Integer>();
 
 public static void main(String[] args) throws Exception {
  Class c = GetGenericTypeDemo.class;
  //原Field反射方式获得泛型类型
  Field f = c.getDeclaredField("map");
  System.out.println(f);
  System.out.println(f.getName());//map
  
/*  // 返回一个 Class 对象
  Class cl = f.getType();
  //获得其类型:interface java.util.Map
  System.out.println("获得其类型:"+cl);*/
  
  //包含泛型的类型
  Type t = f.getGenericType();
  System.out.println(t);//java.util.Map<java.lang.String, java.lang.Integer>
  
  //Type这个类里面没有任何的方法,所以需要调用子类的方法
  ParameterizedType pt = (ParameterizedType)t;

  t = pt.getRawType();//类型的类或接口
  System.out.println(t);
  
  //获取泛型元素class java.lang.String,class java.lang.Integer
  Type[] ts = pt.getActualTypeArguments();
  for (Type type : ts) {
   System.out.println(type);
  }
 }
}

【LE Audio】CAP精讲[1]: 从理论到实操,CAP 协同流程入门全攻略 LEAudio生态中的CommonAudioProfile(CAP)是一个关键协同框架,它通过整合基础音频协议(BAP/VCP/MICP等)构建多设备协同能力。CAP定义了三大核心功能:音频流管理、设备组控制和统一交互服务,解决了传统蓝牙音频在多设备场景下的协同痛点。其规范历经v1.0到v1.0.1的优化,修正了角色定义、连接流程等关键模块,提升设备兼容性。CAP采用严格的语言约定(shall/must/should)和术语体系(ContextType/CCID/协同集),确保不同厂商设备能相互理解。 阅读详情

相关推荐

科研指南:IEEE期刊LaTeX/Word模板下载与使用全解析

本文详细解析了IEEE期刊LaTeX/Word模板的下载与使用技巧,帮助科研人员高效完成论文排版。从官方模板获取入口到LaTeX文档结构配置,再到Word样式管理与常见问题解决方案,全面覆盖投稿准备的关键步骤。特别针对数学公式、参考文献和图片处理等难点提供实用建议,助力学术写作规范化。

weixin_28396629的博客 567

Java对象类型的判断的几种方法

instanceof 判断某个对象是否是某个类的实例或者某个类的子类的实例。它的判断方式大概是这样的: public<T> boolean function(Object obj, Class<T> calzz) { if (obj == null) { return false; } t...

GET知识不迷路,点赞评论加关注! 9927

迷茫之后:Java研发转型售前——选择大于努力!

写下这段文字的时候,小弟已经从Java开发岗位转型软件售前近20天了........ 2011年9月毕业于某培训机构,学的是java语言。之后来到深圳,进入华为外包开始了我的程序猿生涯....刚入职场,第一份工作总是兴奋情绪占主导地位,加入文思创新在华为的人力外包项目组,然后跟着老员工学习、修复小bug,一步一坑的去熟悉那老掉牙的框架...ejb+struts1.2.........项目组老

xuweiwei0415的专栏 1万+

Java基础之—反射

Java基础之—反射(非常重要) 2017年05月13日 13:29:02 敬业的小码哥 阅读数:259044 反射是框架设计的灵魂 (使用的前提条件:必须先得到代表的字节码的Class,Class类用于表示.class文件(字节码)) 一、反射的概述 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取...

yibanbanba的博客 316

Coding Plan:程序员真实工作的可执行编码决策框架

Coding Plan 是一种面向工程实践的编码决策方法论,它超越传统学习路径,聚焦于代码在真实业务系统中的上下文对齐、影响控制与可演进性保障。其核心在于将模糊的开发直觉转化为可度量、可验证、可协作的日常动作,涵盖目标对齐、上下文锁定、验证闭环、协作契约和演进预留五大锚点。结合2026年AI辅助编码新范式,它强调将大模型作为‘上下文翻译器’而非代码生成器,并通过分钟级工作块、技术债主动发行、可观测性前置等机制,显著提升交付确定性与系统长期健康度。本文详解该框架的底层逻辑与落地实践。

weixin_33326218的博客 439

【BIM入门实战】Revit创建地形的几种方法及优缺点

Revit在体量和场地选项卡的【地形表面】工具可以创建三维地形,有三种方法:放置点、指定点文件和导入实例文件、倾斜摄影点云技术和InfraWorks地形生成。 文章目录1. 放置点2. 指定点文件3. 导入实例文件4. 倾斜摄影点云技术5. InfraWorks地形生成 1. 放置点 放置点功能位于体量和场地选项卡下地形表面,点开找到放置点,并通过自定义设置点的高程值来创建地形的高程数据。 优点:通过用户自定义高程点来绘制模型,使地形更为精确。 缺点:只适用于面积小的项目,面积太大,人工效率低下。 .

智慧空间实验室 4760

java method方法_java入门(六) | 方法(Method)的定义和使用

上一期是对java的分支结构进行讲解和实练,分支结构有if 、if(判断语句..){满足条件的代码...}else{不满足的代码}、else if以及switch case,你对他们有理解的怎样呢?这一期是对方法method的介绍,它也被称之为函数,它的基本格式为:方法的修饰符 方法的返回值 方法的名字 ( 参数列表 ) { 代码/方法体 }1、方法1.1 概述Java语言中的“方法”(Metho...

weixin_30120049的博客 6791

使用MATLAB和Simulink来设计并仿真一个智能家居多传感器数据融合系统

智能家居多传感器数据融合系统旨在通过集成来自多种不同类型的传感器的数据,以提供更精确和可靠的环境信息或用户状态监测。例如,将温度、湿度、光照强度、运动检测等多种传感器的数据结合起来,可以更好地了解家庭内部的状态,并做出相应的调整或响应。在这个教程中,我们将使用MATLAB和Simulink来设计并仿真一个智能家居多传感器数据融合系统。

amy_mhd的博客 189

java反射机制详解 及 Method.invoke解释

JAVA反射机制 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。 Java反射机制主要提供了以下功能: 在运行时判断任意

xuxinyl的博客 1417

多物理场光学仿真软件:Ansys Lumerical_(8).CHARGE解决方案详解

CHARGE 模块主要用于求解 Poisson 方程和连续性方程,以模拟半导体器件中的电荷分布和载流子输运。通过 CHARGE 模块,可以分析器件的能带结构、载流子浓度、电流密度等关键参数。这些参数对于理解器件的工作原理和优化设计至关重要。

kkchenjj的博客 1389

基于Simulink的雷达跟踪系统仿真(附源码)

此示例包含对雷达系统的基本特征进行建模的子系统。该模型是用于目标位置和速度检测的雷达系统的典型模型。该示例包括雷达脉冲发生器、射频发射器子系统、移动目标的 Simulink 表示、射频接收器和接收模块(Rx 模块)。

珞瑜的博客 3515

黑马程序员--Java基础加强--14.利用反射操作泛型III【解析关于泛型类型的细节信息的获取方法】【Method与泛型相关的方法】【个人总结】

利用反射操作泛型III 解析关于泛型类型的细节信息的获取方法 Method与泛型相关的方法 ----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------ 以前对Method的讨论中,我们主要是通过Method类对象对Method对象关联的方法的调用的讨论。今天我们通过Method类对象对自身的组成部分( 返回值类型 和 参数类

歆明正航的专栏 2974

微信小程序 - [wxapplib]] backgroundfetch privacy fail {“errno”:101,“errMsg”:“private_getBackgroundFetchDa

微信小程序报错之backgroundfetch privacy fail,微信小程序报错WAServiceMainContext.js:1 [wxapplib]] backgroundfetch privacy fail {“errno“:101,怎么解决?问题出现:调用wx.chooseMessageFile报错(开发者工具中正常)用户隐私协议中未声明小程序使用此功能,安卓真机调试报错:backgroundfetch privacy fail ,怎么解决?微信小程序[wxapplib]] backgrou

🏆 前端领域优质创作者 1万+

Java通过Type类反射获取实际泛型类型参数

无

weixin_43706468的博客 2509

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Java反射和泛型----你真的不知道哟!

Java反射和泛型----带你通向光明顶 目录 1. Java反射---基础巩固 1.1Class概述 1.2Field概述 1.3Method概述 1.4 Constructor概述 2. 注解(Annotation) 2.1 Annotation概述 2.2 使用元注解 2.3 自定义注解 2.4 使用反射API读取注解 3. 泛型---基础巩固 4. 泛型--...

知飞翀的博客 2242

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Java泛型Type体系

最近看开源代码,看到里面很多Java范型,并且通过反射去获取范型信息。如果说要看懂范型代码,那还是比较容易,但是如果要自己利用范型写成漂亮巧妙的框架,那必须对范型有足够的了解。所以这两三天就不在不断地看Java范型相关的东西。如果说想要明白通过反射去获取范型信息,那么Type体系是必须要了解的。Java从1.5开始引入范型,并且也引入了Type体系。首先给出Type的类型树UML图,以便有个整体的认

破磬 7026

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

java反射与泛型_java反射与泛型

反射中与泛型相关的接口和类1 Typejava中所有类型的公共实现接口,实现该接口的有原始类型,参数化类型,数组类型,类型变量和基本类型。2 GenericDeclaration声明类型变量的所有实体的公共接口`TypeVariable>[] getTypeParameters();`返回泛型声明中的类型变量 如Map中返回的是键值K,V3 ParameterizedType 参数化类型...

weixin_35327824的博客 469

Java(五)反射、克隆、泛型、注解

反射;克隆、深克隆与浅克隆;序列化;泛型;语法糖;元注解

HK的博客 2420

java反射泛型类型_Java反射 - 泛型

使用Java泛型通常分为两种不同的情况:声明一个类/接口是可参数化的。使用可参数化的类。当你写一个类或接口时,你可以指定它应该是可参数化的。 java.util.List接口就是这种情况。 而不是创建一个Object列表,你可以参数化java.util.List来创建一个String String列表,如下所示:List myList = new ArrayList();当通过反射在运行时检查可参...

weixin_42493060的博客 781

黑马程序员--Java基础加强--16.利用反射操作泛型V【通过Constructor反射解析泛型构造方法】【通过Field反射解析泛型成员变量】【个人总结】

利用反射操作泛型IV 通过Constructor反射解析泛型构造方法 通过Field反射解析泛型成员变量 ----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------ 1.    通过Constructor反射解析泛型构造方法 1). 构造方法和普通方法关系 (1). 构造方法和普通方法的区别 [1]. 普通方法必须有返回值

歆明正航的专栏 2353

Java反射与泛型

参考:https://mp.weixin.qq.com/s?src=11&timestamp=1578106730&ver=2075&signature=fs-cx1MPWijVQCnuEYuzOeQRiOJjfVL*cD8yG6mahPqTQVricIRFQnVIm5yRcp9SlPTXuk0AZrTNiS6Solle8QNoNeNQvNAuWsiMzf7Pakt6ptd...

Walker_zmc的博客 1047

java 泛型注射与反射

java注解(Annotation)又称为java标注,注解是JDK5.0引入的一种能在代码中加入元数据的机制,不直接影响程序的运行,通过工具或框架,在编译时、类加载时或运行时处理这些元数据,来改变程序的行为或提供额外的功能。

m0_62470444的博客 752

Java之通过反射来操作泛型

反射操作泛型(Generic)  Java采用泛型擦除机制来引入泛型。Java中的泛型仅仅是给编译器Javac使用的,确保数据的安全性和免去强制类型转换的麻烦。但是编译一旦完成,所有和泛型有关的类型全部被擦除。   为了通过反射操作这些类型以迎合实际开发的需要,Java新增了ParameterizedType,GenericArrayType,TypeVariable和WildcardType几种...

yiyongjiajun521的博客 596

通过反射获得泛型的参数化类型

<br />通过反射获得泛型的参数化类型<br />·黎活明老师贡献的一段代码:<br />package lqq.heima.day2;<br />import java.lang.reflect.Method;<br />import java.lang.reflect.ParameterizedType;<br />import java.util.Date;<br />import java.util.Vector;<br />public class GenericalReflection {<b

liuqingqian001的专栏 1135

黑马程序员--Java基础加强--15.利用反射操作泛型IV【通过反射Method解析泛型方法思路】【通过Method对四种Type子接口类型进行解剖】【使用递归对任意复合泛型类型进行彻底解剖】【个人

利用反射操作泛型IV----- 通过反射Method解析泛型方法思路 通过Method对四种Type子接口类型进行解剖 使用递归对任意复合泛型类型进行彻底解剖 ----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------ 1.    通过反射Method解析泛型方法思路 解析总体思路 想通过反射获取方法的参数类型: ste

歆明正航的专栏 1876

Java反射Method和Field简单实例

目录 定义 使用方法 1.Field 2.Method 3.简单实例 定义 JAVA反射机制是在运行状态中,对于任意一个实体类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。 JAVA反射的方法主要有三种:Class,Method,Field...

君当自强 1392
上一篇: Java反射之Class,Constructor,Field
下一篇: Java类加载器之管理资源和配置文件
marching21
博客等级 码龄12年 0粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值