"黑马程序员"张老师高新学习笔记(反射)

ThinkPHP手把手快速拼接网站完整源代码(含数据库文件) ThinkPHP手把手快速拼接网站完整源代码(含数据库文件),可用于毕业设计模板文件。 立即下载

 ----------------- android培训、java培训、期待与您交流! ----------------------


每个类被加载之后,系统就会为该类生成一个对应的Class对象通过该Class对象就可以访问到JVN中的这个类。java程序获得Class对象通常有如下三种方式:

1,使用Class类的forName()静态方法。该方法需要传入字符串参数,该字符串参数的值是某个类的全限定类名(必须添加完整的包名)

2,调用某个类的class属性来获取该类对应的Class对象。例如Person.class将会返回Person类对应的Class对象。

3.调用某个类的getClass()方法,该方法是java。lang。Object类中的一个方法,所以所有java对象都可以调用该方法,该方法将会返回该对象所属对应的Class对象。


对于第一种方式和第二种方式都是直接根据该类来获取该类的Class对象,但相比之下,第二种方式有如下两种优势:

(1)代码更安全,程序在编译阶段就可以检查需要访问的calss对象是否存在。

(2)程序性能更高,因为这种方式无须调用方法,所以性能更好。

四个方法用于访问Class对应的类所包含的构造器:

 (1)Constructor<T>getConstructor(class<?>...parameterTypes):返回此Class对象所表示的类的指定的public构造器(

(2)Constructor<?>[]getConstructors():返回此Class对象所表示的类的所有public构造器。

          /*

             一下代码是通过构造器的反射来实现动态代理

   */

      

         Class collectionProxy=Proxy.getProxyClass(Collection.class.getClassLoader(), Collection.class);//获得代理类的class
Constructor []constructors=collectionProxy.getConstructors();//获得代理类的所有构造器

     //获得构造器的名字和构造器的参数类型
    for(Constructor constructor:constructors){

             String constructorName=constructor.getName();//构造器的名字
             StringBuilder stringBuilder=new StringBuilder(constructorName);//定义StringBuilder并初始化
             stringBuilder.append('(');
             Class []paramterTypes=constructor.getParameterTypes();//得到构造器的参数类型
   for(Class parameterType:paramterTypes){
    stringBuilder .append(parameterType.getName()+",");//拼接参数类型名
   }
   stringBuilder.deleteCharAt(stringBuilder.lastIndexOf(","));//删除最后一个逗号
   stringBuilder.append(')');
   System.out.println(stringBuilder.toString());
}
Constructor constructor=collectionProxy.getConstructor(InvocationHandler.class);//得到带参数的构造器

//定义内部类,重写invoke方法,用来处理代理类方法时的一些日志处理或则业务处理
class myInvocationHandler implements InvocationHandler{
    @Override
    public Object invoke(Object proxy, Method method, Object[] args)
    throws Throwable {
    return null;
    }
   }
Collection collection=(Collection)constructor.newInstance(new myInvocationHandler());

(3)Constructor<T>getDeclaredConstructor(String name ,Class <?>...ParameterTypes):返回此class对象所表示的类的指定构造器,与构造器的访问级别无关。

(4)Constructor<?>[]getDeclaredConstructor():返回此class对象所表示的构造器,与构造器的访问级别无关。

四个方法用于访问Class对应的类所包含的属性(Field):

(1)Field getField(String name):返回此Class对象所表示的类的指定的public属性(Field)。

(2)Field[] getFields():返回此Class对象所表示的类的所有public属性(Field)。

(3)Field getDeclaredFields(String name):返回此Class所表示的类的指定属性(Field),与属性的访问级别无关。

  (4)Field[] getDeclaredFields(String name):返回此Class所表示的类的全部属性(Field),与属性的访问级别无关。

  例如  student stu=new student("tangjin1", 98);
 Field field=stu.getClass().getField("name");
 System.out.println(field.get(stu)); 
 Field field2=stu.getClass().getDeclaredField("score");
 field2.setAccessible(true)

使用反射生成并操作对象:

Class对象可以获得该类里的成分包括方法(由Method对象表示),构造器(由Constructor对象表示),Field(由Field对象表示),这三个类都定义在java。lang。reflect包下,并实现了java。lang。reflect。Member接口,程序可以通过Method对象来执行对应的方法,通过Constructor对象来调用对应的构造器创建对象,能通过Field对象直接访问并修改对象的属性值。

通过反射来生成对象有如下两种方式:

(1)使用Class对象的newInstance()方法来创建该Class对象对应类的实例,这种方式要求该Class对象的对应类有默认构造器,而执行newInstance()方法实际上是利用默认构造器来创建该类的实例。

(2)先使用Class对象获取指定的Constructor对象,再调用Constructor对象的newInstance()方法来创建该Class对象对应类的实例。通过这种方式可以选择使用某个类的指定构造器来创建实例。

调用方法:

当获得某个类的对应的Class对象后,就可以通过该class对象的getMethods()方法或者getMethod()方法来获取全部方法或指定方法--这两个方法的返回值是Method对象组,或者Method对象。

每个Method对象对应一个方法,获得Method对象后,程序就可以通过该Method来调用对应方法,在method里包含一个invoke()方法,该方法的格式为:Object invoke(Object  object,Object。。。args):该方法中obj是执行该方法的主调,后面的args是执行该方法的实参。
访问属性值:

通过Class对象的getFields()或者getField()方法可以获取该类所包括的全部Field(属性)或者指定Field。Field提供了如下两组方法来访问属性:

(1)getXxx(Object obj):获取obj对象该Field的属性值。此处的Xxx对应8个基本类型,如果属性的类型是引用型则取消get后面的Xxx。

(2)setXxx(Object obj,Xxx  val):将obj对象的该Field设置为val值。此处的Xxx对应8个基本类型,如果该属性的类型是引用型则取消set后面的Xxx。

   实践代码如下:

//通过反射来获取apply方法的method

Method  method=test.class.getMethod("apply", ArrayList.class);

//通过getGenericParameterTypes()获取范型参数的类型 ,他包括范型的类型

Type  []types=method.getGenericParameterTypes(); 

//Type向下转换成ParameterizedType

ParameterizedType  parameterizedType=(ParameterizedType)types[0];

 System.out.println(parameterizedType.getActualTypeArguments()[0]);//通过getActualTypeArguments()获得范型类型集合

//定义apply方法

void apply(ArrayList<String>){}

注意:因为范型是在编译时才能去判断的,执行的时候不会去判断,通过该反射可以获得范型的类型

 ---------------------- android培训、java培训、期待与您交流! ----------------------
详细请查看:http://edu.youkuaiyun.com/heima

基于PLC的茶叶揉捻机自动控制系统设计【附代码】 茶叶揉捻是初茶加工过程中的一道关键工序,通过揉捻可以使鲜茶叶成条、碎茶及叶组织细胞破损等。影响茶叶成条率、碎茶率和叶组织细胞破损的主要因素包括揉捻时间、压力和揉捻桶转速。为了提高茶叶品质的稳定性和减轻工人的劳动强度,本文提出了一种基于PLC自动控制技术的茶叶揉捻机控制系统设计。📊 PLC自动化设计 | 毕业设计指导 | 工业自动化解决方案。✅ 具体问题可以私信或查看文章底部二维码。✅ 感恩科研路上每一位志同道合的伙伴! 阅读详情

相关推荐

FPGA新手避坑指南:Vivado 2020.2里配置PLL IP核,从差分时钟输入到上板实测的全流程

本文详细介绍了在Vivado 2020.2中配置PLL IP核的全流程,包括差分时钟输入、参数设置、仿真验证及上板实测。针对FPGA新手常见的配置错误和硬件连接问题,提供了实用的解决方案和调试技巧,帮助开发者快速掌握时钟管理技术。

weixin_27051161的博客 486

[黑马程序员]银行系统-跟着张老师敲代码

其实,这个题拿到之后,按照习惯,没有先直接继续看,er

tomlucky001的专栏 763

vscode+latex+bib文献管理

下载vscode 安装插件`` 在setting.json中配置 在.tex文件中编写论文内容,然后左侧TEX侧边栏中编译,如下图所示,中文用xelatex,英文用pdflatex;编译成功后,就可以查看pdf版本的论文了,我一般在浏览器显示。 涉及到文献编译:XXX.bib中存储文献管理内容;XXX.tex是文章内容,使用xelatex编译后会生成XXX.aux,ctrl+⋅ctrl+·ctrl+⋅打开命令行窗口,输入bibtex XXX(可以对aux文件进行编译,不需要加后缀),然后再xelatex.

小卜妞的博客 2548

黑马程序员 Java自学总结二十二 张老师7K面试题之银行业务调度系统

总结内容来源于张孝祥老师的7K面试题之银行业务调度系统  这次又把张老师的银行业务调度系统看完了 , 看完后 , 第一感觉就是要比交通灯管理系统复杂很多 , 代码量也是交通灯的两倍 , 反复的看了3遍才勉强看明白 , 感觉现阶段自己完全不可能独立做出这种系统 , 不过就像张老师说的 , 每个人最初都是模仿 , 借鉴 , 使用别人的代码 , 用的多了 , 自己的经验多了 , 以后自己就会渐渐的

u011425950的专栏 810

【数字图像处理第四版课后习题答案】第2章 数字图像基础(含英文原版)

如图 P2.3 所示,视网膜图像中与点相对应的直径 x 是由类似的三角形得到的。即得出 x = 0.085d。根据第 2.1 节中的讨论,并结合一些自由解释,我们可以将眼窝视为一个方形传感器阵列,拥有大约 337,000 个元素,这相当于一个大约 580×580 个元素的阵列。假设元素间距相等,则在 1.5 毫米长的直线上有 580 个元素和 579 个空间,共计 1,159 个。换句话说,如果一个点的直径 d<1.3×10-6 m,或者 d<15.3×10 m,眼睛就无法检测到这个点。

weixin_56463218的博客 1万+

Qualcomm工具的使用

简介   由于我们公司主要是以高通平台为主,所以工具的使用是必不可少的,包括QPST、QRCT3、QXDM、QDART等。   高通工具顾名思义就是,对于高通平台的软件开发进行软件的烧录,软件的调试,软件的Log的抓取和分析过程,像我们平常用的大致就是烧版本、改NV、制作QCN、然后校准、强发强收等操作。 QPST   QPST主要是用来做一些参数的配置,包括EFS文件的编辑,QCN的导入和备份与...

Jimmy 2万+

黑马程序员----张老师 之 交通灯管理系统

一、交通灯管理系统的业务。      模拟实现十字路口的交通灯管理系统逻辑,具体需求如下:     1.异步随机生成按照各个路线行驶的车辆。 例如:      由南而来去北向的车辆……直行车辆      由西而来去南向的车辆……右转车辆      由东而来去南向的车辆…….左转车辆     2.信号灯忽略黄灯,只考虑红灯和绿灯     3.应考虑左转

kayfire1的专栏 644

KMS服务器一键部署与激活实战指南

本文详细介绍了KMS服务器的一键部署与激活实战指南,包括快速入门、安装步骤、服务管理技巧及常见问题排查。特别针对Windows和Mac用户提供了Office激活的具体操作步骤,并分享了高级配置与优化方案,帮助IT管理员高效管理批量授权激活。

weixin_29305313的博客 460

黑马程序员--张老师--银行业务调度系统

------- android培训、java培训、期待与您交流! ----------

tototu的专栏 841

Carla中如何渲染opendrive车道线和车道标识(全网独家,附代码)

carla是可以单独加载opendrive并渲染路面的,但是无法把车道线渲染出来,这是一个大坑,因为没有车道线就无法给感知输入。楼主已经实现,直接渲染车道线或者带PBR贴图的车道标识。实现起来非常简单,但必须对carla源码以及ue的开发足够了解。在carla源码中有一个很重要的类opendrivegenerator,它是关于opendrive渲染的全部方法,但是你是找不到它实例化的地方的,因为它被定义在蓝图关卡中。网上包括carla官方关于carla源码的分析少之又少,楼主将自己的经验写出来供大家参考。

u013998156的博客 1090

Flink CDC 中 StartupOptions 模式详解

Flink CDC 的 StartupOptions 模式用于指定作业启动时从源数据读取数据的起始位置,不同的模式适用于不同的业务场景,可满足多样化的数据处理需求,主要有 Initial 模式、Earliest 模式、Latest 模式、SpecificOffset 模式和 Timestamp 模式。

RodJohnsonDoctor的专栏 849

黑马程序员_反射

---------------------- <a href="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a>、<a href="http://www.itheima.com"target="bl...

chifengzi4202的博客 159

YOLOv8 改进:添加 LSK 注意力机制

通过添加 LSK 注意力机制,YOLOv8 能够更有效地捕捉特征图上的重要信息,提高检测性能,尤其是在复杂场景下展现出色的表现。这种方法不仅适用于资源受限的设备,还能在丰富多样的实际应用中提供强劲支持。

走向CTO的路上... 1221

【黑马程序员】张老师高新知识学习(1)

------- ASP.Net+Unity开发、.Net培训、期待与您交流! --------- 1。javac是编译器,java是运行环境。java版本高于javac版本可以正常运行,反之不行。 2。eclipse开发环境下,分为workspace-项目-包的结构,上层结构的配置改变会影响下层。 3.常用操作:alt+/自动补全; ctrl+/注释鼠标选择区域;ctrl+Shift+T

进击的程序猿 579

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

黑马程序员—JAVA基础学习日记十——反射学习总结

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------          java高新技术反射部分,算是java的进阶学习,我感觉还是比较不易理解的,看了张老师的视频,特意边打边总结,以便以后查看和理解 反射的概念是由 Smith 在 1982 年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力。这一概念的提出很快引发了计

无码骑兵的博客 3140

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

黑马程序员---张老师高新技术之反射,内省及注解

------- android培训、java培训、期待与您交流! ---------- 反射: 反射的基石--->Class类 Class类代表Java类,它的实例对象对应各个类在内存中的字节码,例如,Person类的字节码,ArrayList类的字节码,等等。 一个类被类加载器加载到内存中,占用一片存储空间,这个空间里面的内容就是类的字节码,不同的类的字节码是不同的,所以它们

zhangshisk的专栏 610

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

黑马程序员_java高新技术(3)反射

------- android培训、java培训、期待与您交流! ---------- 一.自己理解的 反射就是照妖镜 运行是判断判断一个对象所属的类 运行时构造任意一个类的对象 class X{} X x=new X(); x.getclass.getName();//获取全路径 c1=Class.forName("com.cisst.X");//括号里面填路径

ztr999的专栏 499

黑马程序员—马上快毕业了,给你们点建议吧

文章来源:黑马程序员,黑马论坛 首先就是基础重要不重要,这个不好做定论,因为看你需要掌握的程度,黑马这边的课程需要基础在视频里都有,老毕的25天和张老师的高新技术,这些全部会用到,把这些全看熟了,并掌握原理才是关键,你去看什么字符串有操作创建几个对象这种的,自己提高可以,但对听课无帮助,除非你已经进入内存管理或者告诉缓存等方面的应用才会逐渐考虑对象的多少,占用内存,以及字符串常量池引起的浅溢出等

heima_28的专栏 1769

黑马程序员——java基础增强反射的学习

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------      java基础学习进行到最后的部分,有些激动,除此之外,听老师讲课的部分,由于习惯性毕老师的讲解,听张老师的有些很不习惯。也因此听了3遍才学完反射的部分,比较难,而且做做笔记方面,比较混乱,内容也较少,主要还是理解为主吧,以后还要继续加强反射的学习。 反射: 一,概念    

wsz225005的博客 481

"黑马程序员"张老师Java高新技术学习(注解、类加载器)

----------------- android培训、java培训、期待与您交流! ---------------------- 注解相当于一种标记,在程序中加了注解就等于为程序打上了某种标记,没加,则等于没有某种标记,以后,javac编译器,开发工具和其他程序可以用反射来了解你的类及各种元素上有无何种标记,看你有什么标记,就去干相应的事。标记可以加在包,类,字段,方法,方法的参数以及局部变量上

tangjinjava的专栏 544

【黑马程序员】张老师高新知识学习(2)

12.hashCode的作用:高效地从集合中查找元素。 (1)每个对象可以计算出一个哈希码,可以将哈希码分组,每 组分别别对应某个存储区域。将新元素放入时就只与部分元素 比较就可以。所以,一个类的hashCode()方法只有在hashset中 才有意义。 (2)当一个对象被存入HashSet中后,就不能修改这个对象中 的那些参与计算哈希值的字段,否则,对

进击的程序猿 443

黑马程序员_高新技术_内省、注解

---------------------- <a href="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a>、<a href="http://www.itheima.com"target="bl...

chifengzi4202的博客 242

黑马程序员_对于Java高新技术的学习笔记

---------------------- android培训、java培训、期待与您交流! ---------------------- 马上去黑马学习了 又回过头来把张老师的视频过一遍心里有点低 嘿嘿 在 黑马 学习很有压力的 自动装箱和自动拆箱: Integer obj=3;//自动装箱的操作把一个基本数据类型给一 个 对象 System.out.println(ob

李啸 981

黑马程序员-技术博客汇总

  从开始入学申请流程到现在,已经过了三个多月了,在这期间,根据毕老师的java基础视频,一步步把java的基础认真的梳理了一遍,争取能把基础巩固好,避免在黑马的学习过程中由于基础问题而导致的力不从心。视频中对知识点的讲解十分到位,相信只要是用心多看几遍,跟着后面多敲代码,都能有所收获。 java基础 黑马程序员-面向对象 黑马程序员-Java String类 黑马程序员...

weixin_33860147的博客 276

黑马程序员——高新技术(概述)

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

u010322906的专栏 421

黑马程序员---Java高新技术上的总结

---------------------- android培训、java培训、期待与您交流! 枚举 反射 泛型 内省 代理 这些感觉讲的都是概念性的东西 现在都用不到 但是很重要,以后会天天接触 大概记录一下 几个重要的地方 枚举: 枚举和类很像 感觉就是有特定规则的类 这一个枚举感觉很典型了 public enum Lamp{ RED(35)

Koccu 364
上一篇: "黑马程序员”银行业务调度系统学习日志
下一篇: "黑马程序员"张老师Java高新技术学习(注解、类加载器)
tangjinjava
博客等级 码龄16年 0粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值