反射

来源:互联网 发布:windows gif 录制 编辑:程序博客网 时间:2024/05/29 16:39

类加载详解

反射详解

Class类

理解:用来描述java类这一类事物

获得Class对象

每个类被加载后,系统就会为该类生成一个对应的Class对象,通过Class类对象可以访问到JVM中的这个类。

得到字节码的三种方式:

         1,Class cls1 =Person.class            调用类的class属性来获取对应的Class对象

         2,Class cls2 =p1.getClass()           对象调用该方法获取Class对象

         3,Class cls3 =Class.forName()     Class类的静态方法

         作用:返回字节码,JVM中有,直接返回,没有就加载类,然后缓存起来

程序清单:


反射:

         就是把java类中的各种成分映射成相应的java类

         例如:一个java类用一个Class的对象来表示,一个类中的组成部分:成员变量,方法,构造方法,包等等信息也用一个个java类来表示。Class类提供一系列方法来获得其中的变量,方法,构造方法,修饰符,包等信息。这些信息就是用相应的实例对象来表示,它们是Field,Method,Contructor,Package

 

Constructor类:

代表某个类中的一个构造方法


Field类:

         代表某个类中的一个成员变量

类只有一个,而类的实例对象可以有多个,如果是与对象关联,那么关联的那个对象,就指向那个对象的对应的属性

         如代码中的fieldX代表的是X的定义,而不是具体的X变量


可以将上面获得y属性的方法改成如下:


作业:运用反射技术,将任意一个对象中的所有String类型的成员所对应的字符串内容中的

“t”改成”m”;

源代码如下:

ReflectPoint.java


ReflectTest2.java


结果:

Method类:
代表某个类中的一个成员方法

得到类中的某一个方法:

         Method charAt = Class.forName(“java.lang.String”).getMethod(“charAt”,int.class);

调用方法:

         通常方式:System.out.println(str.charAt(1));

         反射方式:System.out.println(charAt.invoke(str,1));


用反射方式执行某个类中的main方法:
目标:

写一个程序,根据用户提供的类名,执行该类中的main方法


数组的反射:

1, 具有相同维数和元素类型的数组属于同一个类型,即具有相同的Class实例对象

2, 代表数组的Class实例对象的getSuperClass()方法返回的父类为Object类对应的Class

3, 基本类型的一维数组可以被当作Object类型使用,不能被当作Object[]类型使用;非基本类型的一维数组,既可以当作Object类型使用,又可以当作Object[]类型使用。(基本数据类型不能当成对象使用,即不能转换成引用数据类型)

4, Arrays.asList()方法处理int[]和String[]时的差异


对数组进行反射:

ClassArray


hashCode方法与HashSet类:

HashSet集合中存放的元素不能重复,判断元素是否相同通过hashCode值和equals()方法

可以重写上述方法


注意:对象被存入hashSet集合后就不要更改计算hash值的属性了,更改后会找不到该对象导致该对象无法被删除,从而造成内存泄漏

原创粉丝点击