2022.2.12

其他

  1. Object[] args表示的是命令行参数

2022.2.13

on java 8 (摘录)

  1. Class对象使用泛型语法时,newInstance()会返回对象的确切类型,而不仅仅是简单的Object,就像在ToyTest.java示例中看到的那样。但它也会受到一些限制:

    // reflection/toys/GenericToyTest.java
    // 测试Class类
    // {java reflection.toys.GenericToyTest}
    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();}
    }
    

    如果你得到了基类,那么编译器只允许你声明这个基类引用是“FancyToy的某个基类”,就像表达式Class<? super FancyToy>所声明的那样。它不能被声明为Class<Toy>。这看起来有点儿奇怪,因为getSuperclass()返回了基类(不是接口),而编译器在编译时就知道这个基类是什么——在这里就是Toy.class,而不仅仅是“FancyToy的某个基类”。不管怎么样,因为存在这种模糊性,所以up.getConstructor().newInstance()的返回值不是一个确切的类型,而只是一个Object

    这里我是真感觉有意思,因为编译阶段确实应该知道基类的确切类型,而java本身又具有单继承机制,又不像c++的多继承会导致编译器不知道应该选择哪个基类,令人懵逼,让我感觉这个机制是不是从c++那里抄过来的,但又没有将它给融入进java的体系里,让人感觉另类

  2. Java中还有第三种形式的反射。这就是关键字instanceof,它返回一个boolean值,表明一个对象是否是特定类型的实例。

  3. 传统的类型转换。比如“(Shape)”,它使用反射来确保转型是正确的。如果你执行了错误的转型,它会抛出一个ClassCastException

  4. 代表对象类型的Class对象。你可以查询Class对象来获取有用的运行时信息。

问题

  1. 为什么在java在传统的类型转化中用到了反射.

    简单反射,它假定你在编译时就已经知道了所有可用的类型

    这是反射最基本的形式,在运行时检查了所有的类型转换是否正确。这就是反射的意思:在运行时,确定对象的类型。

19.2 Class

  1. Class<? super FancyToy> up = ftc.getSuperclass();
    

    会引起父类的被加载

  2. 如何用父类的Class对象找到子类

    package com.tutorialspoint;import java.lang.*;public class ClassDemo {public static void main(String[] args) {try {ClassDemo cls = new ClassDemo();ClassDemo subcls = new SubClass1(); // class ClassDemoClass c = cls.getClass(); System.out.println(c);// sub class SubClass1Class c1 = subcls.getClass();System.out.println(c1);// represent a subclass of the specified class objectClass retval = c1.asSubclass(c);System.out.println(retval);} catch(ClassCastException e) {System.out.println(e.toString());}}
    }class SubClass1 extends ClassDemo {// sub class
    }
    

    我自己感觉这种获取方法很鸡肋,因为你还是需要得到子类的Class对象,才能确定子类

  3. Class<FancyToy> ftc = FancyToy.class;System.out.println(ftc);
    

    这个的输出结果是这个

    class reflection.toys.FancyToy

    可以说,Class对象转化成字符串的默认格式就是上面这样的

  4. Class对象存在一个cast()方法,这个方法是用来转型用的,就是将某一个类的实例对象转化成Class对象指定的类

动态代理

  1. 我看的博客https://www.cnblogs.com/gonjan-blog/p/6685611.html

    https://segmentfault.com/a/1190000040680716

  2. public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)
    
  3. Person stuProxy = (Person) Proxy.newProxyInstance(Person.class.getClassLoader(), new Class<?>[]{Person.class}, stuHandler)
    

    这里面第二个参数表示的是Person这个接口的Class对象

  4. 动态代理的优势在于可以很方便的对代理类的函数进行统一的处理,而不用修改每个代理类中的方法。是因为所有被代理执行的方法,都是通过在InvocationHandler中的invoke方法调用的,所以我们只要在invoke方法中统一处理,就可以对所有被代理的方法进行相同的操作了。

    这里注意下指的是代理类的代理对象里每一个方法前都被加了这个,而如果用的静态代理的话,我们只能对具体的方法进行操作,这里的一个关键转变就是将具体的方法转化成了invoke方法的调用

    Person stuProxy = (Person) Proxy.newProxyInstance(Person.class.getClassLoader(), new Class<?>[]{Person.class}, stuHandler);
    

    然后注意下这一行,stuProxy是Person接口的一个实例,所以可以调用下面的givemoney方法.我提前想错了以为是代理类的实例,然后因为他只有一个invoke方法让我有点难以理解可以调用不同的方法

  5. Object invoke(Object proxy, Method method, Object[] args) throws Throwable

    Processes a method invocation on a proxy instance and returns the result. This method will be invoked on an invocation handler when a method is invoked on a proxy instance that it is associated with.

    • Parameters:

      proxy - the proxy instance that the method was invoked on

      method - the Method instance corresponding to the interface method invoked on the proxy instance. The declaring class of the Method object will be the interface that the method was declared in, which may be a superinterface of the proxy interface that the proxy class inherits the method through.

      args - an array of objects containing the values of the arguments passed in the method invocation on the proxy instance, or null if interface method takes no arguments. Arguments of primitive types are wrapped in instances of the appropriate primitive wrapper class, such as java.lang.Integer or java.lang.Boolean.

    这里invoke的第三个参数是方法参数,就是我们平常的.printf().

其他

2022.2.13java学习笔记相关推荐

  1. 2022 开源轮子学习笔记

    2022 开源轮子学习笔记 OKHttp(OKHttp) 总结: OkHttp的内部实现通过一个责任链模式完成,将网络请求的各个阶段封装到各个链条中,实现了各层的解耦. 值得一看的参考: https: ...

  2. 2022年Java学习笔记目录

    一.2022年Java任务驱动课程 任务驱动,统摄知识点:2022年Java程序设计讲课笔记 二.2022年Java学习笔记 (一)踏上Java开发之旅 Java学习笔记1.1.1 搭建Java开发环 ...

  3. 2022.07.25 学习笔记

    学习笔记 使用in查询效率慢 当使用sql进行查询的时候,某些时候使用in,即使in的集合元素数量比较少,数据库中数据较少,但是查询的速度还是很慢,如下: SELECTcreatetTimer,ip, ...

  4. 2022谷粒商城学习笔记(二十二)rabbitMQ学习

    前言 本系列博客基于B站谷粒商城,只作为本人学习总结使用.这里我会比较注重业务逻辑的编写和相关配置的流程.有问题可以评论或者联系我互相交流.原视频地址谷粒商城雷丰阳版.本人git仓库地址Draknes ...

  5. 2022谷粒商城学习笔记(二十三)分布式事务

    前言 本系列博客基于B站谷粒商城,只作为本人学习总结使用.这里我会比较注重业务逻辑的编写和相关配置的流程.有问题可以评论或者联系我互相交流.原视频地址谷粒商城雷丰阳版.本人git仓库地址Draknes ...

  6. 2022.1.17 学习笔记 (SPN中业务是如何传输的,主要是业务切片的调度编排)

    一.SPN简介 SPN 技术是一种基于 SDN 架构.具有硬切片特性的的时分复用技术,具有高效的路由分配.多通道聚合,不同业务间的网络切片,以及低时延的交换的特点.SPN 架构上分为 SPL层,SCL ...

  7. 2022黑马Python学习笔记

    一.导学 Pthon语言基础入门 Pthon语言高阶加强 大数据分析PySpark 二. 初识Python 你好Python程序 print("Hello World!!")> ...

  8. 2022.5.4.学习笔记数据类型

  9. 【Ansys Maxwell 2D】电磁场有限元仿真新手教程 [EE 2022/7/11学习笔记]

    第一步,建立一个空项目,并在该项目下新建一个Maxwell 2D Design.在项目第一个文件列表里的所有内容都填完后,我们的有限元仿真就算完成了: 第二步,设置求解器类型. 接着是绘制模型,先在坐 ...

最新文章

  1. CentOS 6.5安全加固及性能优化
  2. Atom.io设置ctrl+delete
  3. 数据库事务以及事务的隔离级别
  4. 甲方都爱的C4D设计,有了这组灵感,0基础也能get​!
  5. Linux工作笔记040---Centos8.2安装mysql5.7.18_已经测试成功
  6. 如何清除web 服务器的缓存
  7. iOS开发 mac证书无法展开
  8. python编写ftp客户端_python实现ftp客户端示例分享
  9. RxJava在Android中的简单应用
  10. 【史上最全的PLC源码】2978个PLC应用例程合集
  11. 京东架构专家分享京东架构之路
  12. 【语音识别入门】Python音频处理示例(含完整代码)
  13. 中国古代传说中的四大神兽
  14. Linux文件目录管理、文件内容查看以及文件内容查询命令(详细命令)
  15. 迷你播放器--第一阶段(5)--添加搜索功能--autoCompleteBox的使用
  16. android驱动开发 老罗,在Ubuntu上为Android增加硬件抽象层(HAL)模块访问Linux内核驱动程序(老罗学习笔记3)...
  17. Linux环境下Shell脚本基础篇-鸡兔同笼问题
  18. 360与腾讯招式详解
  19. easypoi 语法_高中语法精讲系列七丨高中英语八大语法之“名词性从句”要点归纳...
  20. springboot_vue校园二手交易平台java毕业设计

热门文章

  1. Ubuntu系统---NVIDIA 驱动安装
  2. go语言之行--golang核武器goroutine调度原理、channel详解
  3. 背水一战 Windows 10 (20) - 绑定: DataContextChanged, UpdateSourceTrigger, 对绑定的数据做自定义转换...
  4. python_day6 shutil模块
  5. C Primer Plus(第五版)7
  6. Junit单元测试学习笔记一
  7. 关于 【通过代理访问】 的研究,【突破 IP ,“无限制”投票】
  8. Page_Load Page_Init方法使用原理(转)
  9. 分块查询 缓解内存开销
  10. [Python图像处理] 二十一.图像金字塔之图像向下取样和向上取样