package .com;
import java.lang.reflect.Method;
import java.lang.reflect.Type;
import java.util.Random;
/*
* 本次学习RTTI: 即在运行时,识别一个对象的类型;
* 第一部分:
* Class类 :就像不同的人又Person 类 那么不同的类也有其类型Class类;
* 每个类都有一个Class对象,换言之,每当编写并且编译一个新类,就会产生一个Class对象(被保存在一个同名的.class文件中)
* 无论何时,只要我们想在运行时使用类型的信息或者知道那个对象的实际类型,就必须首先获得对这个Class对象的引用,有三
* 种方式可以获得某个对象所对应的Class对象的引用:
* 1.运用Class类中的静态方法:Class c = Class.forName("类的全限定名称");
* Class personClass = Class.forName("com.qian.Person");我们就拿到了指向Person这个字节码的引用,
* 2.运用Object类中的静态方法:Class c = new Person().getClass();
*
* 3.运用类字面常量方式:类名.class (Person.class);其不仅可以应有于普通的类,也可以应用于接口,数组,以及基本数据类型;
* 对于基本数据类型的包装器类,还有一个标准的TYPE字段,TYPE字段也是一个引用,指向对应的基本数据类型的Class对象。
* int.class 等价于 Integer.TYPE;其次使用".class"来创建Class对象的引用时,不会自动地初始化该Class对象,区分与forName();
*
* 加载----->链接------>初始化
* 分析下面 Initate One-Three过程 可见 初始化有效的实现了尽可能的 惰性
* 仅使用 .class语法来获得对类的引用不会引发初始化;但是为了产生Class引用 Class.forName()立即就进行了初始化;
* 对于编译期常量的处理:
* 对于编译期常量JVM知道其具体是多少,所有它就不会在初始化类;例如下面的:
* System.out.println("InitateOne.staticFinalOne is: "+InitateOne.staticFinalOne);只会输出47不会初始化静态代码块;
* 对于只是将一个域设置为 static 和final的还不足以确保知道这个数确切值,此时就会对类进行初始化;例如下面:
* System.out.println("InitateOne.staticFinalTwo is: "+InitateOne.staticFinalTwo);
* 对于一个static域不是final的,那么在访问它是,总是要求在读取之前,要先进性链接(为这个域分配存储空间)和初试化(初始化该存储
* 空间)例如:System.out.println("InitateTwo.staticNonFinal is: "+InitateTwo.staticNonFinal);
*
*
* 第二部分:
* Class的泛化;
* Class intClass = int.class;
* intClass = double.class;这样也是可以的,因为普通类的引用可以被指向任何其他的Class对象
* 通配符 : ? 上面式子等价于 Class<?> intClass =int.class; intClass = double.class;
* 范围界定:Class<? extends SuperClass> 和 Class<? super SonClass>
*
*
*
*
*
* */
class InitateOne{
final static int staticFinalOne = 47;
static final int staticFinalTwo = ReflectTwo.rand.nextInt(500);
static{
System.out.println("Load InitateOne through static");
}
public InitateOne(){
System.out.println("Load InitateOne through default construct");
}
}
class InitateTwo{
static int staticNonFinal = 147;
static{
System.out.println("Load InitateTwo through static");
}
public InitateTwo(){
System.out.println("Load InitateTwo through default construct");
}
}
class InitateThree{
static int staticNonFinal = 74;
static{
System.out.println("Load InitateThree through static");
}
public InitateThree(){
System.out.println("Load InitateThree through default construct");
}
}
//练习泛型;
class SuperClass{
private String name;
SuperClass(){}
SuperClass(String name){
this.name = name;
}
public void eat(){
System.out.println(name+" super.eat");
}
}
class SonClass extends SuperClass{
private String sonName;
SonClass(){}
public SonClass(String sonName){
super(sonName);
}
public void show(){
System.out.println(sonName+" is show()");
}
}
class SonClass2{
private String sonName;
SonClass2(){}
public SonClass2(String sonName){
this.sonName = sonName;
}
public void show2(){
System.out.println(sonName+" is show2()");
}
}
public class ReflectTwo {
public static Random rand = new Random(47);
public static void main(String[] args) throws Exception {
//1.public T cast(Object obj)//将obj对象强制转换成Class对象所表示的接口或者类;(非继承和实现就报错)
// SuperClass sup = SuperClass.class.cast(new SonClass());
Class sc = Class.forName("GeneIterAdaptReflect.com.SonClass");
Method[] sms = sc.getMethods();
for(Method m:sms){
Type[] t =m.getTypeParameters();
for(Type ty:t)
System.out.println(m.getReturnType()+" "+m.getName()+"("+ty.getTypeName()+")");
}
}
public static void initateMethod(){
Class InitateOneClass = InitateOne.class;
System.out.println("after create InitateOne reference throught .class");
System.out.println("InitateOne.staticFinalOne is: "+InitateOne.staticFinalOne);
System.out.println("InitateOne.staticFinalTwo is: "+InitateOne.staticFinalTwo);
System.out.println();
/*打印结果:
* after create InitateOne reference throught .class
*InitateOne.staticFinalOne is: 47
*Load InitateOne through static
*InitateOne.staticFinalTwo is: 258
* */
System.out.println("InitateTwo.staticNonFinal is: "+InitateTwo.staticNonFinal);
/*打印结果:
* Load InitateTwo through static
*InitateTwo.staticNonFinal is: 147
*/
System.out.println();
Class InitateThreeClass = Class.forName("GeneIterAdaptReflect.com.InitateThree");
/*打印结果:
* Load InitateThree through static
* */
System.out.println("after crete InitateThree.class reference through forNAme()");
System.out.println("InitateThree.staticNonFinal is: "+InitateThree.staticNonFinal);
/*
* after crete InitateThree.class reference through forNAme()
* InitateThree.staticNonFinal is: 74
* */
}
}
相关推荐
学习笔记--在线强化学习、离线强化学习、连续强化学习的区别(4)
在连续强化学习中,状态和动作都是连续的,这意味着智能体可以采取无限数量的动作,并且状态空间是连续的,而不是离散的点。- 策略评估和模型选择:在离线学习中,如何有效地评估不同策略和模型的性能,是一个重要的研究问题。- 连续学习和迁移学习:在线学习中,学习者需要不断在不同任务和环境中学习,研究者致力于研究如何将之前学到的知识迁移到新任务中,以实现更高效的学习和决策。- 连续动作选择和优化:在连续动作空间中,智能体对动作的选择是无限的,研究者在连续强化学习中通常关注如何有效地选择连续动作,以达到最优决策策略。
浅谈Java及应用学java
随笔 - 108, 文章 - 0, 评论 - 58, 引用 - 0 一个牛人给Java初学者的建议 给初学者之一:浅谈Java及应用学java 从不知java为何物到现在一个小小的j2ee项目经理虽说不上此道高手,大概也算有点斤两了吧每次上网,泡bbs逛论坛,没少去java相关的版 面总体感觉初学者多,高手少,精通的更少由于我国高等教育制度教材陈旧,加上java自身发展不过十年左右的...
新手入门:N-CMAPSS数据集解析与实战指南
本文详细解析了N-CMAPSS数据集的结构与应用,为新手提供航空发动机故障预测的实战指南。通过Python代码示例展示数据加载、探索和特征工程技巧,帮助读者快速掌握剩余寿命(RUL)预测的关键步骤,并分享常见问题解决方案与进阶学习路径。
最适合初学者学习的JAVA书籍
在网上经常看到和我一样在苦苦寻求进入java神圣殿堂大门的朋友们,于是就萌发了写这篇文章的想法。 近期要买书学习的朋友一定要看看此文,说不定会对你有帮助也说不定!!! 仅以此文献给想要或正在前往java神圣殿堂的朋友们。 此书就是大名鼎鼎的 《java 2核心技术 卷i:基础知识(原书第7版)》(被《程序员》等机构评选为2006年最受读者喜爱的十大it图书之一) 【内容简介】 本书是j
Cursor+Playwright MCP实现UI全自动化,告别繁琐元素定位!
摘要:本文探讨了利用Cursor和PlaywrightMCP实现UI自动化测试的创新方法。通过将AI编程助手与浏览器自动化技术结合,解决了传统UI自动化测试中元素定位繁琐、维护成本高等痛点。文章详细介绍了项目架构设计、AI使用技巧(包括精准提问和编写.mdc规则文档),以及如何实现自然语言测试用例到自动化脚本的转换。最终实现了测试人员只需输入手工测试步骤,AI即可自动生成完整测试代码的智能化流程,并展望了通过Excel表格一键生成测试用例的未来发展方向,为UI自动化测试提供了高效解决方案。
告别重复劳动:用Python+pywinauto打造你的微信个人助理(自动回复/收款/定时发消息)
本文介绍如何利用Python和pywinauto库构建微信个人助手,实现自动回复、定时消息、智能收款等功能,告别重复劳动。通过详细的代码示例和配置指南,帮助开发者快速掌握微信自动化技术,提升工作效率。
151.反射-获取Constructor对象__
package com.itheima.myreffect2; import java.lang.reflect.Constructor; public class Reffectdemo { public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException { //method1(); //method2(); //method.
修改注册表导致开机时电脑显示“无法登陆到你的账户”的问题解决方案
1.问题描述:开机电脑显示“无法登陆到你的账户:通常可以通过从你的账户注销,然后重新登陆来解决问题,如果不立即注销,你创建的任何文件或进行的任何更改都将会丢失。” 2.问题原因:想要修改cmd中的用户名(红色部分),修改了注册表,重启时出现问题。 3.问题解决: win+R输入cmd,确定进入注册表界面,将下面的地址复制进地址栏(你也可以自己按目录查找),双击ProfileImage...
java开发项目经验_Java项目经验——程序员成长的钥匙
今天给大家分享一篇Java项目经验,希望可以给正在成长中的新手Java程序员一个学习的方向!Java是用来做项目的!Java的主要应用领域就是企业级的项目开发!要想从事企业级的项目开发,你必须掌握如下要点:1、掌握项目开发的基本步骤2、具备极强的面向对象的分析与设计技巧3、掌握用例驱动、以架构为核心的主流开发方法没有人愿意自己一辈子就满足于掌握了一些代码实现的技巧,别人告诉你要实现什么,你就用代码...
制作 img系统镜像的详细方法
I.MX6开发板目前支持从TF卡和eMMC启动,启动时,由于各个不同的启动文件对路径有不同的要求,例如uboot文件要求位于启动设备的某个块,dtb文件要求在FAT分区上,文件系统要求在Linux分区上,基于此,我们目前采用将映像制作成img文件的方式,这样可以更简单完成对启动卡的制作。 关于如何制作img,方法如下:方法一 Windows下面利用Win32工具1. 准备我司提供...
RK3588+TRL8367s 四网口千兆交换机配置与优化实战
本文详细介绍了基于RK3588高性能SoC与TRL8367s千兆交换芯片构建四网口交换机的完整实战流程。内容涵盖硬件连接、设备树配置、内核驱动加载、性能优化及常见问题排查,重点解析了RGMII时序调试、DSA架构配置等关键步骤,为嵌入式网络设备开发提供实用指南。
从初学者到专家:Java反射的完整指南
反射是Java语言中的一项强大特性,它允许程序在运行时动态地获取、操作和修改类、对象、字段和方法的信息。通过反射,我们可以实现灵活的类实例化、字段访问和方法调用,以及处理注解和实现动态代理等功能。然而,反射的使用应谨慎,需要平衡灵活性、性能和安全性,并注意其局限性和注意事项。总而言之,反射为Java开发者提供了强大的工具,使得程序可以在运行时动态地适应不同的需求和场景。
第 9 篇:TMC2240 速度调节实战|STEP 信号生成 + 平滑调速算法(无抖动)
摘要:本文详细介绍了TMC2240电机调速方案,重点解决调速时电机抖动、丢步等问题。核心原理是通过STEP信号频率控制转速,结合平滑加减速算法避免电流冲击。文章从速度与STEP频率的数学关系入手,提供了定时器生成固定频率STEP信号的实现代码,并给出不同转速下的频率参数表。针对42步进电机+256微步细分场景,详细讲解了定时器初始化、中断处理及固定转速设置方法,帮助开发者实现稳定调速。全文包含可直接复用的代码片段,适合嵌入式开发者快速实现电机平滑调速功能。
初学java反射机制
回顾之前java程序如何创建类1.分析确定类名,属性名,方法.....创建类2.创建类的对象3.使用类一切都是已知的这种写发一般用于业务开发<servlet></servlet></select>框架需要只写一套程序,就可以处理我们给他的任意类,框架是如何做到写一套程序就可以处理任意类了?以前通过new对象,写方法的使用方式,可以看作是正向使用类.框架需要对任意类处理时,他只是知道类的名字,通过类的名字动态获得类中的信息.把这种对类的使用方式成为反向使用.
计算机控制技术及应用
《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。
假人有限元模型
假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用
java初学者实践教程-反射
java初学者实践教程24-反射 还是那样的,java的概念就是多,有时候多的还没等你反应过来又给你出来一个新的概念。反射是个很重要的概念,这是一种机制,不只是java里面有,很多语言里面都有。这个概念是一个叫Smith的大师,由1982年提出来的。指的是一类应用,它们能够自描述和自控制。这样说太抽象了。我们看个例子,实践:
SIMATIC S7-1200, S7-1500 PID 控制[手册]
SIMATIC S7-1200, S7-1500 PID 控制[手册]
初学——java反射
一、反射 1.什么是反射 反射是指在程序运行期间,能够观察和修改类或者类的对象的属性和行为的特性 2.为什么用反射 在java中有动态和静态的概念 静态是指在java中所有的类都编写好编译通过运行 动态是在在编写好类,编译运行中动态获取类的信息修改类的属性叫做反射. 例如:在已经运行的大项目中需要修改代码,如果项目处于运营,停止项目会带...
Java反射机制(适合初学者)
java反射机制(初学者福利)前言最近在学习Java的反射机制,看了很多网上的资料,感觉有点深,初学者理解起来有点困难,干脆把自己理解的写了些总结,希望能对初学反射机制的童鞋有些帮助,如果有不对的地方,还望各位侠士不吝指出.注:部分内容来源于网络一.什么是反射网络上的定义是:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和...
初学JAVA反射
初学JAVA反射机制
初学java之注解和反射篇
1 注解 1.1 什么是注解 Annotation是从JDK5.0开始引入的新技术 Annotation的作用: 不是程序本身,可以对程序作出解释。(这一点和注释(comment))没什么区别) 可以被其他程序(比如:编译器等)读取。 Annotation的格式: 注解是以”@注释名“在代码中存在的,还可以添加一些参数值,例如:@SuppressWarnings(value = “unchecked”). Annotation在哪里使用? 可以附加在package,class, method
Java 反射及原理
反射,指的是对于任意一个类,都可以动态的获得它的所有属性和方法,对于任意一个对象都能调用的它的所有属性和方法,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。 想要理解反射首先我们要知道JVM也就是java的虚拟机,java能够跨平台也是因为它,JVM说白了也就是一个进程,只不过是用来跑你的代码的。 上图是java的内存模型,我们关注的点,一个方法区,一个栈,一个堆,初学的时候老师不深入的话只告诉你java的内存分为堆和栈,易懂点吧! 假如你写了一段.
JavaSE初学——简单介绍什么是反射,以及反射中最常见的基本用法
本篇文章主要针对反射中对于类的 (构造方法、成员方法、单个字段) 的 获取、调用 操作。
java初学笔记10-反射
反射反射概述理解Class类并实例化Class类对象运行时创建类对象并获取类的完整结构通过反射调用类的指定方法、指定属性动态代理 反射概述 理解Class类并实例化Class类对象 运行时创建类对象并获取类的完整结构 通过反射调用类的指定方法、指定属性 动态代理 ...
Java反射源码
反射 (Reflection) 是 Java 的特征之一,它允许运行中的 Java 程序获取自身的信息,并且可以操作类或对象的内部属性。简而言之,通过反射,我们可以在运行时获得程序或程序集中每一个类型的成员和成员的信息。程序中一般的对象的类型都是在编译期就确定下来的,而Java 反射机制可以动态地创建对象并调用其属性,这样的对象的类型在编译期是未知的。所以我们可以通过反射机制直接创建对象,即使这个对象的类型在编译期是未知的。
初学者应该要怎么了解反射?
对我们业务开发者来说,反射就像 “水电”—— 你不用知道水电是怎么输送到家里的,但每天都要用电、用水;你不用自己写反射代码,但每天用的框架都靠反射运行。反射没那么玄乎 —— 它就是“程序在运行时,通过‘类的全路径’查类信息、调用类功能的能力”。你不用精通它的所有 API,但必须知道:Spring 靠它自动创建对象,MyBatis 靠它动态执行 SQL,SpringBoot 的配置读取—— 搞懂这一点,以后用框架时就不会只 “知其然”,还能 “知其所以然”。下次再有人问你 “反射是什么”,你就说:“
(初学)JAVA的反射机制
前言: 在学习反射机制之前,我熟悉的操作是: 1、程序的运行过程 编译器,将.java文件编译成.class(二进制)文件。 运行期,jvm加载并运行.class文件。 2、对象创建的过程 编写类–>创建对象–>调用成员。 所有的上面操作都是发生在编译期。 一、什么是JAVA反射机制 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都...
Java类反射的示例
1)Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制。(2)反射(Reflection)是Java程序开发语言的特征之一,它允许运行中的Java程序对自身进行检查,也称自审,并能直接操作程序的内部属性。例如,使用它能获得Java类中各成员的名称并显示出来。(3)Java的这一能力在实际应用中应用得很多,在其它的程序语言中根本就不存在这一特性。...
Oracle数据库:下载与安装图解
本次学习Oracle数据库的下载与安装过程: 安装版本:Oracle Database 11g 第 2 版 (11.2.0.1.0) 安装环境:win7 64位; Oracle下载地址: http://www.oracle.com/technetwork/cn/database/enterprise-edition/downloads/112010-win64soft-086667-zhs.
3601



被折叠的 条评论
为什么被折叠?



