`
hubin4
  • 浏览: 93063 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

for java beginner 8 java 反射的基础基础Class的理解

    博客分类:
  • JAVA
阅读更多
java 反射 的基础基础  Class的理解

反射 在 1.2 的时候就有了,
基本上所有的框架都会用到.

有的小东西 e.g. junit 也用到了,
反射无处不在的

要了解 反射 必须必须必须了解一个 类 类的类 Class

类-->描述一类事物,规定你应该有什么属性,不应该有什么属性
       至于属性的具体值是什么,无所谓!由具体对象决定


User类--> 规定了你有姓名,年龄等属性的一类东西

生活里还有一类东西,就是我们编程时用的 类
这一类东西, 我们用 Class 来抽象

那么Class类 规定了编程时用的类 应该有些什么东西呢???
最最起码要规定
你应该有一个名字吧
你应该有一个包名吧
你应该有一堆属性信息
你应该有一堆方法信息
父类是什么
实现了什么接口
等等。。。
.................

=========================
Person p1 = new Person();
Person p2 = new Person();
上面人人都知道

那么下面呢??
Class clazz1 = ?;
Class clazz2 = ?;
这几个问号该怎么办呢??
Class clazz = new Class(); //JAVA里没有这种规定
Class代表内存里的一堆 字节码 的抽象
Class clazz = 字节码 ; 这是对的
解释一下什么是 字节码?
当程序去compile 这一行代码时
Person p1 = new Person();
JVM需要去 disk 上加载Person 的字节码 *.class 文件 到内存里
把p1指向那一堆 字节码,改属性就是改 这堆东西的内容.

当然一个程序不仅仅是需要一堆 Person 字节码,
还需要其他的,比如 Date Math 等,

那么 内存就有三堆 字节码,
★也就是 三个 Class的实例 !!! 

我们可以这样写
Class clazz = Person.class ;
Class clazz = Date.class ;

可以这么简单的理解
Class 是一堆一堆 字节码 的抽象 [码里有名字,包名,属性信息,方法信息..]
clazz 是一堆字节码的 引用
Person.class 代表一堆实实在在的 字节码


Person p1 = new Person();
p1代表什么呢??
代表那一堆 字节码 生成 的对象,
那么这有没有方法得到 那堆 字节码呢?
有!!p1.getClass();

现在有两种方法 得到 字节码:
Class clazz1 = Person.class;
Class clazz2 = p1.getClass();

还有一种方法
Class.forName("java.lang.String")
这也可以得到一份 字节码
[直接内存里拿,内存里没有就用 类加载器去加载]

总的有三种方法!!!
Class clazz1 = Date.class;
p1.getClass();
Class.forName("java.lang.String");

最后一种用法最最广: 你给我名字好了,我自己去找那份字节码,不用写死!
[记得动态Form么?就是在XML写好的类名字]
最后一种写法有两个用途:
1 返回一份字节码
2 把那份字节码 import 到 JVM 里

整个JAVA里有9个预定义的 Class实例
就是9份 字节码
8个基本 加 一个void
Class clazz = void.class;//呵呵,从来不会有人用,但是是对的
int.class == Integer.TYPE;


======================
package com.ncs;

public class ReflectTest {
	public static void main(String[] args) throws Exception {
		String str = "hubin";
		Class clazz1 = str.getClass();
		Class clazz2 = String.class;
		Class clazz3 = Class.forName("java.lang.String");
		
		System.out.println(clazz1 == clazz2); //true
		System.out.println(clazz1 == clazz3); //true 
		//所以,在内存里 字节码 都是一份的,
		
		System.out.println(clazz1.isPrimitive()); // false 不是基本类型 String肯定不是基本类型
		System.out.println(int.class.isPrimitive()); // true 这个是基本类型
		System.out.println(int.class == Integer.class); //false  int是一分字节码  Integer 也是另一份字节码
		System.out.println(int.class == Integer.TYPE); //true 这是SUN给我们弄的 那个TYPE 得到包装类基本类的 字节码
		System.out.println(int[].class.isPrimitive()); // false 你这个数组了
		System.out.println(int[].class.isArray()); // true  这可以判断数组
		
		//void 也是TYPE
		
		//总之,只要在源程序里出现的类型
		//都有自己的Class实例对象
		//e.g. int[]  void 
		//void 也是类型, 这个类型表示没有类型
	}

}

=======================
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics