java学习笔记 2022.2.11
2022.2.11
on java 8 摘录(反射)
- 加载。这是由类加载器执行的。该步骤会先找到字节码(通常在类路径中的磁盘上,但也不一定),然后从这些字节码中创建一个
Class
对象。- 链接。链接阶段会验证类中的字节码,为静态字段分配存储空间,并在必要时解析该类对其他类的所有引用。
- 初始化。如果有基类的话,会先初始化基类,执行静态初始化器和静态初始化块。
初始化被延迟到首次引用静态方法(构造器是隐式静态的)或非常量静态字段时:
// reflection/ClassInitialization.java import java.util.*;class Initable {static final int STATIC_FINAL = 47;static final int STATIC_FINAL2 =ClassInitialization.rand.nextInt(1000);static {System.out.println("Initializing Initable");} }class Initable2 {static int staticNonFinal = 147;static {System.out.println("Initializing Initable2");} }class Initable3 {static int staticNonFinal = 74;static {System.out.println("Initializing Initable3");} }public class ClassInitialization {public static Random rand = new Random(47);public static voidmain(String[] args) throws Exception {Class initable = Initable.class;System.out.println("After creating Initable ref");// 不会触发初始化System.out.println(Initable.STATIC_FINAL);// 触发初始化System.out.println(Initable.STATIC_FINAL2);// 触发初始化System.out.println(Initable2.staticNonFinal);Class initable3 = Class.forName("Initable3");System.out.println("After creating Initable3 ref");System.out.println(Initable3.staticNonFinal);} } /* 输出: After creating Initable ref 47 Initializing Initable 258 Initializing Initable2 147 Initializing Initable3 After creating Initable3 ref 74 */
实际上,初始化会“尽可能懒惰”。从
initable
引用的创建过程中可以看出,仅使用.class
语法来获取对类的引用不会导致初始化。而Class.forName()
会立即初始化类以产生Class
引用,如initable3
的创建所示。如果一个
static final
字段的值是“编译时常量”,比如Initable.staticFinal
,那么这个值不需要初始化Initable
类就能读取。但是把一个字段设置为static
和final
并不能保证这种行为:对Initable.staticFinal2
的访问会强制执行类的初始化,因为它不是编译时常量。如果
static
字段不是final
的,那么访问它时,如果想要正常读取,总是需要先进行链接(为字段分配存储)和初始化(初始化该存储),正如在对Initable2.staticNonFinal
的访问中看到的那样。
一个
Class
引用表示的就是它所指向的确切类型:Class
类的一个对象。
要想放松使用泛化的
Class
引用时的限制,请使用通配符?
,它是Java泛型的一部分,表示“任何事物”。尽管如我们看到的那样,普通的
Class
并不会产生编译器警告,但是和普通的Class
相比,我们还是倾向于Class<?>
,即使它们是等价的。Class<?>
的好处在于,它表明了你不是偶然或无意识地使用了非具体的类引用。你就是选择了这个非具体的版本。
这种写法的话如果想表示子类可以这样<? extend 父类>
package reflection.toys;public class GenericToyTest {public static voidmain(String[] args) throws Exception {Class<FancyToy> ftc = FancyToy.class;// 生成确切的类型:FancyToy fancyToy =ftc.getConstructor().newInstance();Class<? super FancyToy> up = ftc.getSuperclass();// 下面的代码无法通过编译:// Class<Toy> up2 = ftc.getSuperclass();// 只能生成ObjectObject obj = up.getConstructor().newInstance();} }
这段代码很有意思,如果去掉第六行括号内的内容,会导致ftc得到的是一个Object类型,
问题
19.2 Class
类
首先Class类的作用就是描述了一个类的Class类文件中的信息,包括它的初始化器,它的接口,它的静态变量,它的父类这些信息
Class类的每一个类的实例都是唯一确定,例如一个类叫做Cat,那么我在实例化Cat以后,它的Class对象也就生成了,同时,此时我们初始化变量
Cat one = new Cat(); Class cat = Cat.class; Cat two = new Cat(); Class cat1 = Cat.class;
应该理解成这两个引用是相同的,不管我后面会不会再去实例化Cat一个新的对象
从上面可以推导出,Class类实际上是让我们有了直接操作类的实例化的可能性,因为不使用Class类时,这些都是java帮我们解决的
还要注意Class类的加载是在编译阶段的,而Class类的实例化是在运行时的,而前缀为static final就是编译时常量,如果去掉final,那么静态常量就是可以修改的,所以去掉以后算运行时常量,而运行的化会导致Class对象被初始化,
如何利用Class类生成实例对象
class cat {private String name="hajdka";private int age=131;public cat(){}public String getName() {return name;}public int getAge() {return age;} }public class GenericClassReferences {public static void main(String[] args) {try{System.out.println(cat.class.getConstructor().newInstance().getAge()+" "+cat.class.getConstructor().newInstance().getName());}catch (Exception e){e.printStackTrace();}} }
其他
default :包访问权限,即同一个包中的类可以可见。默认不显式指定访问控制权限时就是 default 包访问控制权限。
初始化(英語:Initialization)在计算机编程领域中指为数据对象或变量赋初值的做法,如何初始化则取决于所用的程序语言以及所要初始化的对象的存储类型等属性。用于进行初始化的程序结构则称为初始化器或初始化列表。
java学习笔记 2022.2.11相关推荐
- java学习笔记2022.1.11
因为我提前的傻逼行为,导致1.11的笔记基本全没了,没保存的泪流满面,然后缺失的是方法内部类还有匿名内部类,有时间的话会补完,没时间就算了 首先谈方法内部类 public class D {publi ...
- java学习笔记2022.2.11
on java 8 摘录(反射) 面向对象编程的一个基本目标就是,让编写的代码只操纵基类(本例中为Shape)的引用 Shape接口中的方法draw()是可以动态绑定的,因此客户程序员可以通过泛化的S ...
- java 学习笔记2022.1.26
排序 Comparator接口 有关于Comparator接口,这个接口一般是作为参数放在排序方法里的,最开始我也觉得挺别扭的,后面想了想,这也主要是因为在java中,单独的一个函数不能存在,所以设计 ...
- java学习笔记2022.1.15
其他 public class PokeDemo {public static void main(String[] args ){try {Pokemon a1 = PokemonManage.ge ...
- java学习笔记2022.1.17
### 包装类 1. 需要知道的一些知识点 package xiangzi;public class TestOne {public static void main(String[] args){I ...
- java学习笔记2022.1.13
异常 System.exit(非0整数):用来终止程序,可以避免执行finally,如下可以参考 import java.util.Scanner;public class one {{System ...
- java学习笔记2022.1.12
异常 五个异常关键词 try-catch-finally的写法格式 public void method(){try {//代码段1//产生异常的代码段}catch(异常类型 e){//对异常进行处理 ...
- 算法学习笔记2022.1.11
1. 插入算法的核心代码 public static void sort(Comparable[] a) {int n = a.length;for (int i = 1; i < n; i++ ...
- Java学习笔记:2022年1月11日
Java学习笔记:2022年1月11日 摘要:这篇笔记主要讲解了一些数据在计算机中的存在方式相关的知识点,并由此延伸出了数据在计算机中的操作以及一些数据结构的知识. 文章目录 Java学习笔记:2 ...
最新文章
- 新疆兵团开展迎新春“送文化下基层”慰问演出活动
- SpringBoot+WebSocket实时监控异常
- 工作总结20190121
- cocos2dx游戏开发——微信打飞机学习笔记(五)——BackgroundLayer的搭建
- 计算机网络(1)TCP和UDP
- 嵌入式Linux开发板上NFS文件系统的使用【ZT】
- Java与Web前端发展前景及薪资对比
- 按计划员自动带出对应任务类型
- 机房监控系统解说—开关传感器篇
- crazy-tentacles -- 一个非常有意思的东西
- 手绘小人多彩论文答辩PPT模板
- uniapp-页面内/页面间数据的流动传递-this-that
- 淘宝信用等级|淘宝买家信用等级|淘宝卖家信用等级(图片介绍更清晰)
- 阿里P8大神讲解——Java,JVM内存模型
- 高等数学学习笔记——第六十四讲——偏导数
- linux自动电梯设计,基于嵌入式Linux电梯控制系统
- 利用ARCHPR明文攻击对zip口令进行破解以及报错解决
- 51单片机堆栈深入剖析
- postman使用put方法向华为云obs桶上传文件和图片
- has no exported member
热门文章
- 显示外部页面_前端设计-响应式页面开发基础
- Java黑皮书课后题第6章:**6.27(反素数)反素数(反转拼写的素数)是指一个非回文素数,将其反转之后也是一个素数。编写程序,显示前100个反素数,每行显示10个,并且数字间用空格隔开
- Java黑皮书课后题第5章:**5.22(金融应用:显示分期还贷时间表)对于给定的贷款额,月支付额包括偿还本金及利息。编写一个程序,让用户输入贷款总额年限利率,然后显示分期还贷时间表
- Java黑皮书课后题第5章:5.13(求满足n的三次方<12000的n的最大值)使用while循环找出满足n的三次方<12000的n的最大值
- 基于php的地铁查询系统,省时方便的小程序:查地铁
- 关于服务器的入门知识整理
- 区块链应用落地的6大挑战
- JavaScript学习笔记——BOM_window对象
- Redis:安装、配置、操作和简单代码实例(C语言Client端)[转]
- lambda表达式初步