反射:
定义:反射就是反编辑,获取一个编写好的java程序的属性和方法,然后操作 ;
Class 类:java程序中的各个java类是属于同一类事物,描述这类事物的java类名就是Class ;
众多的人可以用一个类表示Person类,而众多的java类用一个类表示,就是Class类;一个Class就是一个类的字节码。
字节码:一个类以二进制代码的形式存在于硬盘上,当我们用到一个类的时候,它就会从硬盘上加载到内存中,来创建对象,这就是字节码 ;每个字节码就是class的实例对象;
面试题:forName()这个静态方法的作用?
作用就是返回字节码,但是返回的方式有两种:
第一种:这个字节码曾被加载过,在JVM中有,则直接返回即可 ;
第二种:在JVM中还没有,则需要类加载器加载到内存中,等以后用时直接返回 ;
返回字节码的方式有三种:
1、类.class ;
2、对象.getClass() ;
3、Class.forName() ;(反射中用)
方法:
isPrimitive():是否是原始类型
注意 :只要是在源程序中出现的类型,都有自己的Class实例对象 ;数组也是一种类型。
Constructor类:
概述:表示某个类中的构造方法 ;
方法:Constructor[] getConstructor():获取类中的构造方法 ;
Field类:
Field类:
概述:表示某个类中的属性成员,具体就是把某个类中的方法映射到此类中 ;
方法:
1、getField() 获取类中的指定属性成员 ;
2、getField():获取类中的全部属性 ;
3、get(Object obj) : 取得该属性的值
4、set(Object obj ,Object value):将指定属性中的值设置成新值 ;
Method类:
概述:提供类或者接口上的单独某个方法 ;
方法:
invoke(调用方法的对象 , 参数) ; 调用此类中保存的方法 ;
注意:调用方法的对象,则表示此方法为静态的,静态方法调用的时候不用实例化对象 ;
每一个数组的父类也是Object ;
注意:
1. int [] a = new int[]{1,2,3} ;
2. Object[] = a ;
此处编译是错误的,因为Object接受任意的应用类型的变量,这儿就相当于把一个应用类型的变量赋值给Object数组 ,所以出错 ;
通过反射操作数组:
1. package cn.pracktice;
2. import java.lang.reflect.Array;
3. import java.util.Arrays;
4. public class Demo2 {
5. public static void main(String[] args) {
6. int [] a1 = new int[]{1,2,3} ;
7. int [] a2 = new int[3] ;
8. int[][] a3 = new int[4][] ;
9. String s[] = new String[]{"a","b","c"} ;
10. System.out.println(a1.getClass()); //通过反射取得数组的字节码
11. System.out.println(a1.getClass().getName()); //通过反射取得数组的名字
12. System.out.println(a1.getClass() == a2.getClass()); //通过反射比较 数组,返回tru
e,因为它们的字节码都相同
13. System.out.println(Arrays.asList(s)); //通过Arrays类返回数组
14. Object[] ss = s ;
15. // Object[] aa = a1 ; //就相当于把一个应用类型的数组赋给一个Objectjava反射获取父类属性类型的数组
16. int i = 9 ;
17. System.out.println("---------------------");
18. show1(a1) ;
19. show1(s) ;
20. show1("acai") ;
21. }
22. private static void show1(Object obj) {
23. Class c = obj.getClass() ; //取得数组的字节码
24. if(c.isArray()){ //通过字节码判断是否是一个数组
25. int len = Array.getLength(obj) ; //通过反射Array类取得数组 的长度
26. for (int i = 0; i < len; i++) {
27. System.out.println(Array.get(obj, i)); //通过反射类Arrays取得数组 中的每一个元素
28. }
29. }
30. else{
31. System.out.println(obj);
32. }
33. }
34. }
面试题:
HashCode()方法的作用?
1、HashCode()方法是用于哪些基于哈希表的集合上,如果底层不是哈希表的话,那么这个方法就没什么大的用处了 ;
2、如果现在我想在集合中存储了一万个元素,然后遍历,要发现某个元素要与遍历的对象进行equals()比较,那速度显然是特别慢的;
hashCode()方法是利用了哈希值,它把内存中划分了N个区间,每一个区间都有对应的
哈希值,比较是先计算哈希值然后在对应的区间去,这样,效率就提高了不少;
3、但是,如果是两个对象的,但是封装的值都相同,可是他们的内存地址都相同,那么还是会有遗漏 ;所以,在equals()比较相同时,那么哈希值则就必须相同;
4、在比较哈希值时,如果类中的值被修改了,那么他们的哈希值就会改变,则会出现内存溢出现象;
Java中有内存泄露吗?
有 ;就是一个一些值在内存中一直保持着,等到了极限的时候就会溢出啊,这就是内存泄露;
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论