黑马程序员--java 反射

来源:互联网 发布:星星知我心电视剧全集 编辑:程序博客网 时间:2024/04/29 16:01


---------------------- android培训、java培训、期待与您交流! ----------------------


Class类

Java中的各个类属于同一事物,描述这类事物的java类就名就是Class;对比提问,众多人用一个什么类表示?众多的java类用一个什么表示?
 人---person   java类---Class
对比提问:Person类代表人,它的实力对象就是张三,李四这样一个个具体的人,Class类代表java类,它的各个对象实力分别又是什么?
对应各个类在内存中的字节码,例如Person类的的字节码,ArrayList的自己码,等等,一个类被类加载器加载到内存中,占用一片内存空间,这个空间里面的内容就是类的字节码,不同的类字节码是不同的,所以他们在内存中的内容是不同的,这是一个个的空间可分别用一个个的对象类来表示,这些对象显然是相同的类型,这个类型是什么呢?就是Class类
如何得到各个字节码对应的实例对象(Class类型)
方法一 类名.class,例如System.class
方法二 对象.getClass()
法三 Class.forName(“类名”); 

创建Class类
查看api文档发现Class类没有构造方法,因此不能像其他类一样通过构造函数创建对象。获得Class对象的方法有以下:
Class clazz1 = Date.class
Class clazz2 = obj.getClass()
Class clazz3 = Class.forName("java.lang.String")
其中用Class.forName()方式第一次用到类时,java虚拟机就会加载此类到内存,如果虚拟机发现已经加载过此类,那么就直接使用已有的字节码,不在重新加载。
**Class类是反射的基础

反射就是把java类中的各个成分映射成相应的java类。例如,一个java类中用一个Class类的对象来表示,一个类中的组成部分:程序员变量,方法,构造方法,包等等信息也用一个个的java类来表示,就像汽车是一个类,汽车中的发动机,变速箱等等的也是一个个的类。表示java类的class类显然要提供一系列的方法,来获得其中的变量,方法,构造方法,修饰符,包等信息,这些信息就是相应类的实例对象来表示。他们是Filed 、 Method 、Constructor、Package等等
一个类中的每个成员都可以用相应的反射API的一个实例对象来表示,通过调用Class类的方法可以得到这些实例化对对象
Constructor代表的是一个类中的构造方法
得到某个类中的所有构造方法:
例:Constructor [] constructors  = Class.forName(“java.lang.String”),getConstructor();
得到某一个构造方法
例:
//通过传入参数类型.class得到想要的构造方法
Constructor constructor = Class.forName(“java.lang.String”).getConstructor(StringBuffere.class);
Class的newInstance方法:
用此方法可以比用Constructor更方便地使用无参数的构造方法来创建对象
例:String str=(String)Class.forName(“java.lang.String”).newInstance();
//该方法内部先得到默认的无参数的构造方法,然后用该构造方法创建对象

Field类
通过反射把类的成员变量封装为新的类,这个类名称叫Field。
字节码对象提供两组方法获得Field对象:
getField(String name)/getFields(),访问公共成员变量
getDeclareField(String name)/getDeclareFields(),访问所有变量
import java.lang.reflect.Field;
public class ReflectTest {
       public static void main(String[] args) throws Exception {
       ReflectPoint pt1 = new ReflectPoint(3,5);
              Field fieldY = pt1.getClass().getField("y");//参数为变量名,指示获得哪个变量
             //fieldY的值是多少?是5,错!fieldY不是对象身上的变量,而是类上的,要用它去取某个对象上对应的值
              System.out.println(fieldY.get(pt1));//参数为对象
              Field fieldX = pt1.getClass().getDeclaredField("x");//获得私有的x
              fieldX.setAccessible(true);//获得了变量x,但不一定能访问,需要设置
              System.out.println(fieldX.get(pt1));
   }
}

Method类
通过反射把类的成员方法封装为Method类。
可以运用字节码提供的方法getMethod(String name,Class<?>... parameterTypes)获取Method对象。
小结:反射就是利用类的字节码映射成新的类。新的包括Constructor、Field、Method。

数组的反射

只要是同一种类型和相同的维度的数组,都可以反射成相同的一段字节码,即同一个Class类,java提供了数组的反射类:Array

ArrayList和HashSet比较及HashCode分析

ArrayList是一个实现了Collection接口的类,Collection的各对象元素之间没有指定的顺序,允许有重复元素和多个null元素对象,即不满足排序,List各对象元素之间有顺序,允许有重复元素和多个null元素对象,ArrayList就是一个实现了List接口的类,所以在ArrayList存放的对象的引用是有位置顺序的,并且可以放多个指向同一个对象的引用。而HashSet则不能放多个指向同一个对象的引用

反射的作用就是实现框架功能(如前面的调用类的main方法,可以处理任何类(及以后的任何类)的main方法,进行调用)
框架可以调用用户提供的类,实现其功能,而工具类则是被用户调用的,在写框架的时候无法知道要调用的类名,也就无法直接new某个实例对象,所以要用到反射。

对于用户而会有一个配置文件(扩展名为:properties)内容一般为要启动的类名,输入的格式为等式的格式。

---------------------- android培训java培训、期待与您交流! ----------------------