Test3_透彻分析java反射机制的基础概念

来源:互联网 发布:知著投资咨询有限公司 编辑:程序博客网 时间:2024/05/01 01:28
1.Java类用于描述一类事物的共性,描述这类事物该有什么属性,不该有什么属性,
但是一个具体的对象具体的属性值是什么,不管,只管你该不该有这个属性,
而不管该属性的值是什么,这就是Java类的作用;
---------------------------------------------------------------
2.Java中的各个类,也是一种事物,他们属于同一类事物,都是Java中的类,我们当然
可以用一个类来描述这类事物,这个类的就是Class;


人-->Person
Java类-->Class
---------------------------------------------------------------
3. //什么是字节码呢?
-->当我们在程序中用到了Person这个类的时候,首先要从硬盘上把这个
类的二进制码(编译过的.Class文件)加载到内存中来,才可以去创建
一个个对象,源程序中有几个类,内存中就有几份字节码,每一份字节码
就是一个Class类的实例对象。
Person p1 = new Person(); Person p2 = new Person();


//p1就是内存中的 Person类对应的字节码生成的对象
Date 类 
Class cls1= Date.class //Class的实例对象代表内存中的一份字节码;//Date.class就表示Date类在内存中的字节码Class cls2= Person.class//同上;p1.getClass();//-->Object类中的方法Class.forName("java.lang.String");//Class的静态方法


-->Class.forName("*.*.*");方法的作用?
作用是返回所加载的类的字节码,如果这个类已经被加载进来了(java虚拟机中有该字节码),
则直接从缓存中调用并返回;
如果该类没有被加载过(java虚拟机中没有该字节码),则调用类加载器加载进来以后,把那份字节码缓存起来
同时返回该字节码
---------------------------------------------------------------
4.得到字节码的方式有三种(上题):
·· 类名.class 
·· 对象.getClass();
·· Class.forName("包名.类名"); 做反射的时候常用第三种,通常在写源程序的时候
还不知道类的名字,可以把"包名.类名"换成一个
字符串变量,在程序运行的时候临时赋值
---------------------------------------------------------------
5.举例:
public class RefilectTest{public static void main(String[] args)throws Exception{String str1 = "abc",Class cls1 = str1.getClass();Class cls2 = String.class;Class cls3 = Class.forName("java.long.String");System.out.println(cls1 ==cls2); //trueSystem.out.println(cls2 ==cls3); //true}}


---------------------------------------------------------------
6.public boolean isPrimitive()
判定指定的 Class 对象是否表示一个基本类型。 
有九种预定义的 Class 对象,表示八个基本类型和 void。
这些类对象由 Java 虚拟机创建,与其表示的基本类型同名,
即 boolean、byte、char、short、int、long、float 和 double。 


这些对象仅能通过下列声明为 public static final 的变量访问,
也是使此方法返回 true 的仅有的几个 Class 对象。 


int.class.isprimitive();//trueint[].class.isPrimitive();//false  数组类型的Class实例对象


---------------------------------------------------------------
7.总之,只要是在源程序中出现的类型,都有各自的Class实例对象,
例如:int[],void ...
---------------------------------------------------------------
8.得到一个Class对象,可以通过 Class.isArray(),Class.isPrimitive()
来知道它到底是什么类型

---------------------------------------------------------------
原创粉丝点击