反射的基石 -> Class 类(字节码)
/*只要是在源程序中出现的类型,都要各自的Class实例对象,例如:int,int[],void*/
如何得到各个字节码对应的实例对象(Class类型)
1.类名.class
2.对象.getClass
3.Class.forName("类名");(1.先忘内存中找,是否有这个字节码 有的话,就是用,没有的话 就使用类装载器的方式,得到字节码)
/*这三种方式得到的字节码 都是同一份 是一样的*/
九个预定义Class实例对象(八种基本数据类型 + void )
1.Class.isPrimitive 判断是否为预定义的实例对象
2.int.class == Integer.TYPE (Integer.TYPE 得到该被包装类型的字节码)
3.int.class != Integer.class (这是两种不同的类型,字节码也不同)

反射
/*反射就是把Java类中的各种成分(成员变量,方法,构造方法,包等)映射成相应的java类。*/
1.得到某个类的构造方法 Constructor
Constructor constructor = Class.forName("java.lang.String").getConstructor(StringBuffer.class)
Class.newInstance()方法 调用默认无参构造方法创建对象(用到了缓存机制来保存默认构造方法的实例对象)

2.成员变量的反射 Field
Field name = Class.forName("xxx.xxx.Person").getField("name"); //name不是某个对象(person)上的变量,而是某个类(Person)上的,要用它去取某个对象上对应的值
field.get(person);//需指定是哪个对象的成员变量

3.成员方法的反射 Method
String str1 = "abc"
Mehod methodCharAt = String.class.getMethod("charAt",int.class); //得到某个类的成员方法
System.out.println(methodCharAt.invoke(str1,1)); /*结果:b*/ //调用哪个对象的该方法,传递什么参数
如果invoke第一个参数传递为 null ,说明调用该类的一个静态方法

/*
* 人在黑板上画圆,涉及三个对象,画圆需要圆心和半径,但是是私有的,画圆的方法
* 分配给人不合适。
*
* 司机踩刹车,司机只是给列车发出指令,刹车的动作还需要列车去完成。
*
* 面试经常考面向对象的设计,比如人关门,人只是去推门。
*
* 这就是专家模式:谁拥有数据(private),谁就是专家,方法就分配给谁
*/

4.用反射方法执行某个类中的main方法
main方法所需的参数是一个字符串数组,当反射调用这个main方法时,invoke传递参数时不能直接给一个字符串数组参数,因为编译的时候会将该字符串数组拆开,变成多个参数,
而main方法只要一个参数,故报错 解决办法:将传递的字符串数组封装成一个Object对象 或者 一个Object[] 对象

5.数组的反射
具有相同维数和元素类型的数组属于同一个类型,即具有相同的Class实例对象
1.所有的数组
int[][]a1 = new int[3][3];
Object[] o1 = a1; /*正确的,int[] 属于Object*/
2.八大基本数据类型不继承于Object
int[] a2 = new int[3];
Object[] o2 = a2; /*错误的,int不属于Object*/

注:Arrays.asList()方法,在jdk 1.4 中,由于 /*没有可变参数*/,接收的参数时Object[] ,在jdk 5.0 中 接收的参数是一个可变参数
故,当System.out.println(Arrays.asList(String[])); 会打印出String数组中的元素的值 因为这里是 /*jdk1.4 去编译*/,
当System.out.println(Arrays.asList(int[])); 因为 /*int不属于Object*/,所以 /*jdk1.4 无法编译 而是5.0 去编译(只会解析一个参数)*/,此时无法打印出元素,而是打印对象

6.ArrayList(有序可重复)和HashSet(无序不可重复)
存数据到ArrayList中时,一个对象一个空间,即使如果这两个数据相互equals,同样是按顺序放到ArrayList中
而HashSet,是一整块混乱的空间,如果存数据时,两个数据equals,后面的那个数据不会存进去

Set集合想要保证元素不重复,可两个元素是否重复应该依据什么来判断呢?( /*先调用新元素HashCode方法,得到物理位置,如果该位置没有元素,那新元素就放到这里,如果有,再equals*/)
这就是Object.equals方法了。但是,如果每增加一个元素就检查一次,那么当元素很多时,后添加到集合中的元素比较的次数就非常多了。
初学者可以这样理解,hashCode方法实际上返回的就是对象存储的物理地址(实际可能并不是)。
当集合要添加新的元素时, /*先调用这个元素的hashCode方法*/,就一下子能定位到它应该放置的物理位置上。
如果这个位置上没有元素,它就可以直接存储在这个位置上,不用再进行任何比较了;如果这个位置上已经有元素了,就调用它的equals方法与新元素进行比较,相同的话就不存了,不相同就散列其它的地址

注:java中的内存泄漏,比如某些东西用不到了,想从内存中移除它,释放内存,
当一个对象被存储进HashSet集合中以后,就不能修改这个对象中那些参与计算哈希值的字段了,否则, /*对象修改后的哈希值与最初存储进HashSet集合中时的哈希值就不同了*/,
导致无法从HashSet集合中单独删除当前对象,从而造成 /*内存泄漏*/

7.反射的作用->实现框架功能
框架要解决的核心问题,我在框架时,你这个用户可能还在上小学 还不会写程序,我写的框架程序怎样才能调用到你以后写的类呢,(不知道会写出什么类)
因为在写程序时,无法知道直接知道要被调用的类名,所以,在程序中,无法直接new某个类的实例对象,而要用到反射来做 (也需要读取配置文件)

Java基础加强-反射机制的更多相关文章

  1. java基础之反射机制

    一.概念 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为jav ...

  2. java基础篇---反射机制

    一.JAVA是动态语言吗? 一般而言,说到动态言,都是指在程序运行时允许改变程序结构或者变量类型,从这个观点看,JAVA和C++一样,都不是动态语言. 但JAVA它却有着一个非常突出的动态相关机制:反 ...

  3. Java基础教程——反射机制

    Java反射机制 Java反射机制是Java语言的一个重要特性,使得Java语言具备"动态性": 在运行时获取任意一个对象所属的类的相关信息; 在运行时构造任意一个类的对象: 在运 ...

  4. 【Java基础】反射机制

    反射 反射可以使我们很方便的创建灵活的代码,这些代码可以在运行时装配,无需在组件之间进行源代码链接.反射允许我们在编写和执行时,使我们的代码能够接入装载到JVM中的类的内部信息,而不是源代码中选定的类 ...

  5. [ 原创 ] Java基础7--Java反射机制主要提供了以下哪些功能?

    AVA反射机制主要提供了以下哪些功能? 在运行时判断一个对象所属的类 在运行时构造一个类的对象 在运行时判断一个类所具有的成员变量和方法 在运行时调用一个对象的方法

  6. 【Java基础】java中的反射机制与动态代理

    一.java中的反射机制 java反射的官方定义:在运行状态下,可以获取任意一个类的所有属性和方法,并且可通过某类任意一对象实例调用该类的所有方法.这种动态获取类的信息及动态调用类中方法的功能称为ja ...

  7. 黑马程序员_Java基础:反射机制(Reflection)总结

    ------- android培训.java培训.期待与您交流! ---------- 反射在java中有非常重大的意义,它是一种动态的相关机制,可以于运行时加载.探知.使用编译期间完全未知的clas ...

  8. 浅说Java中的反射机制(二)

    写过一篇Java中的反射机制,不算是写,应该是抄了,因为那是别人写的,这一篇也是别人写的,摘抄如下: 引自于Java基础--反射机制的知识点梳理,作者醉眼识朦胧.(()为我手记) 什么是反射? 正常编 ...

  9. 黑马程序员:Java基础总结----反射

    黑马程序员:Java基础总结 反射   ASP.Net+Android+IO开发 . .Net培训 .期待与您交流! 反射 反射的基石:Class类 Class类代表Java类,它的各个实例对象又分别 ...

随机推荐

  1. 在过滤器中获取在web.xml配置的初始化参数

    在过滤器中获取在web.xml配置的初始化参数   例如 <filter> <filter-name>cross-origin</filter-name> < ...

  2. Linux -- Proactor(及其与Reactor的比较)

    高并发服务器常由多线程+IO复用服务器(one event loop per thread) 两种I/O多路复用模式:Reactor和Proactor 一般地,I/O多路复用机制都依赖于一个事件多路分 ...

  3. jQuery前端插件以及图片延迟加载

    插件名称 用途 插件官网地址 fontawsome CSS图标插件 http://fontawesome.io easyui 基于jQuery的用户界面插件集合 http://www.jeasyui. ...

  4. eclipse spring3.X redis 整合-配置

    花了一天时间折腾redis的配置 用到的jar spring 3.1.1 aopalliance-1.0.jar commons-pool2-2.3.jar jedis-2.7.2.jar sprin ...

  5. PostgreSQL学习笔记——事务

    事务时需要在同一处理单元中执行的一系列更新处理的集合.通过使用事务,可以对数据库中的数据更新处理的提交和取消进行管理. 事务处理的终止指令包括COMMIT(提交处理)和ROLLBACK(取消处理)两种 ...

  6. 【Leetcode_easy】696. Count Binary Substrings

    problem 696. Count Binary Substrings 题意:具有相同个数的1和0的连续子串的数目: solution1:还不是特别理解... 遍历元数组,如果是第一个数字,那么对应 ...

  7. thinkPHP 类库映射 类库导入

    遵循我们上面的命名空间定义规范的话,基本上可以完成类库的自动加载了,但是如果定义了较多的命名空间的话,效率会有所下降,所以,我们可以给常用的类库定义类库映射.命名类库映射相当于给类文件定义了一个别名, ...

  8. js类似新闻图片轮换(带有文字介绍,其实可以放任何内容)

    js类似新闻图片轮换(带有文字介绍,其实可以放任何内容) 主要是利用style="display:block;" 属性<script language="javas ...

  9. 最新 京东java校招面经 (含整理过的面试题大全)

    从6月到10月,经过4个月努力和坚持,自己有幸拿到了网易雷火.京东.去哪儿等10家互联网公司的校招Offer,因为某些自身原因最终选择了京东.6.7月主要是做系统复习.项目复盘.LeetCode与牛客 ...

  10. windwos提权-CVE-2019-1388

    windwos提权-CVE-2019-1388 guest→system(UAC手动提权) 利用高权限建立一个低权限账户orange 查看权限 win-vomjm1p7c71\orange 下载HHU ...