您的位置:首页 > 编程语言 > Java开发

Java高新技术2----反射应用1

2012-01-08 16:07 246 查看
不是 JDK1.5的新特性 从1.2开始就有 ,在一些框架中 都会用到反射技术 ,这个技术用到的类就是 Class .

我们平时定义类用class ,但是我们这个Class是一个类 ,他代表一类事物 。

那这个Class类到底代表什么事物呢?

我们知道我们定义了一个对象比如 :

String str=new String() ;

那么这个str就是一个类的对象实例,并且对象有有一些信息来描述 这个对象的特性 比如他的内容啊 内容的程度啊 等等 。

这个Class其实也是在描述事物,只是他描述的不是对象的属性,而是Java所有类的属性 等等 、

每一个Java类都对应一个Class对象 ,描述这个类 有几个方法 几个属性 类的名字 等等

可以说Class类就是为了描述Java语言中的所有类的 。



如何获得Class对象呢 ?



比如我们有一个Person类 ,定义Person类的2个对象

Person p1=new Person() ;

Person p2=new Person() ;

那么我们如何获得Class对象呢 ?

Class c1=new Class() ;//这个是错误的因为Class压根就没提供构造方法 或者构造方法是私有的 我们不可能通过构造来产生对象

Class c2=字节码



字节码文件的作用?

字节码文件是 Java源文件编译之后的二进制文件

当我们使用一个类的时候,那么 JVM 会将类的字节码(也就是二进制文件)加载到内存中 , 然后通过这个字节码 在内存冲产生一个一个的对象 ,这才是对象创建的原理

.............................................................................................................................................



如果我用到 String Math Exception这三个类 ,那么内存中 就有三份字节码,那么这三份字节码其实就是三个 Class的对象 。



Class c1=Math.class ;//一旦我们用到这个类 那么内存中就会出现类的字节码 字节码就是一个对象 对象的类型就是Class



Class c2=object.getClass() ;//返回这个对象的类型的 Class对象 其实就是内存中的字节码 这个是从Object继承来的方法



Class.forName(String classname) ;//这个方法的作用?一道面试题

1、是Class类的静态方法 用于在JVM中加载一个指定名字的类,如果这个类没被加载那么JVM类加载器会加载类字节码 ,并返回字节码对象 也就是Class对象加载后的字节码会缓存。



2、第二如果 这个类已经被加载过了 ,那么他会保存在JVM的缓存中 ,那么下次我们调用的时候就不需要再次加载了 我们只需要从缓存中取出 Class对象即可 ,节省内存

反射的时候 主要使用这个 ,可以动态的产生 Class对象

8个基本类型对应8个Class对象 +void 其实有9个Class对象 Class c1=void.class;//这个也正确 因为void也有Class对象

Java反射的应用: Java中的各种类型均有定义的Class实例对象。 包括 原始类型 引用类型 自定义类型 void类型

package me.Test;

public class ReflectTest

{



public static void main(String[]args)

{

String str="abc" ;

Class c1=str.getClass() ; //通过对象的getClass方法返回

Class c2=String.class ; //通过String的class属性

Class c3 =null;

try

{

c3=Class.forName("java.lang.String") ; //通过类名字加载

}

catch(Exception e)

{

e.printStackTrace() ;

}

System.out.println(c1==c2) ;

System.out.println(c2==c3);

System.out.println(c1==c3);

System.out.println(c1.isPrimitive()); //不是原始类型

System.out.println(c2.isPrimitive()); //原始数据类型就是基本数据类型

System.out.println(c3.isPrimitive());//类不是原始数据类型

System.out.println(int.class.isPrimitive());//是原始类型

System.out.println(int.class==Integer.class); //不是原始类型

System.out.println(int.class==Integer.TYPE); //封装类型的TYPE就表示那个包装的原始数据类型的字节码

System.out.println(int[].class.isPrimitive());//数组不是原始类型 在Java中所有类型都有Class对象

}



}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: