反射:
定义:反射就是反编辑,获取一个编写好的java程序的属性和方法,然后操作
Class java程序中的各个java类是属于同一类事物,描述这类事物的java类名就是Class ;
 众多的人可以用一个类表示Person类,而众多的java类用一个类表示,就是Class类;一个Class就是一个类的字节码。
字节码:一个类以二进制代码的形式存在于硬盘上,当我们用到一个类的时候,它就会从硬盘上加载到内存中,来创建对象,这就是字节码 ;每个字节码就是class的实例对象;
面试题:forName()这个静态方法的作用?
        作用就是返回字节码,但是返回的方式有两种:
                第一种:这个字节码曾被加载过,在JVM中有,则直接返回即可
                第二种:在JVM中还没有,则需要类加载器加载到内存中,等以后用时直接返回
                             返回字节码的方式有三种:
                                    1、类.class  ;
                                    2、对象.getClass() ;
                                    3Class.forName() ;(反射中用)
方法:
        isPrimitive():是否是原始类型
注意 :只要是在源程序中出现的类型,都有自己的Class实例对象 ;数组也是一种类型。
Constructor类:
        概述:表示某个类中的构造方法
        方法:Constructor[]  getConstructor():获取类中的构造方法
Field类:
       概述:表示某个类中的属性成员,具体就是把某个类中的方法映射到此类中
        方法:
                1getField() 获取类中的指定属性成员
                2getField():获取类中的全部属性  
                3get(Object obj) : 取得该属性的值
                4set(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()方法的作用?
        1HashCode()方法是用于哪些基于哈希表的集合上,如果底层不是哈希表的话,那么这个方法就没什么大的用处了
        2、如果现在我想在集合中存储了一万个元素,然后遍历,要发现某个元素要与遍历的对象进行equals()比较,那速度显然是特别慢的;
        hashCode()方法是利用了哈希值,它把内存中划分了N个区间,每一个区间都有对应的
哈希值,比较是先计算哈希值然后在对应的区间去,这样,效率就提高了不少;
        3、但是,如果是两个对象的,但是封装的值都相同,可是他们的内存地址都相同,那么还是会有遗漏 ;所以,在equals()比较相同时,那么哈希值则就必须相同;
        4、在比较哈希值时,如果类中的值被修改了,那么他们的哈希值就会改变,则会出现内存溢出现象;

Java中有内存泄露吗?
        ;就是一个一些值在内存中一直保持着,等到了极限的时候就会溢出啊,这就是内存泄露;

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。