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对象
}
}
我们平时定义类用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对象
}
}
相关文章推荐
- java 高新技术【9.2】 泛型类以及反射在泛型中的应用
- Java高新技术2----反射应用1
- java 高新技术【9.2】 泛型类以及反射在泛型中的应用
- Java反射的工厂模式应用
- Java反射技术及其应用
- 黑马程序员_Java高新技术_类加载器的深入讲解与应用
- Java高新技术第二篇:反射技术
- Java反射高级应用--注入代码
- 黑马程序员—JAVA高新技术之反射
- Java反射基础应用
- 黑马程序员——Java高新技术_反射
- 黑马程序员 java高新技术<二>--java5的枚举、反射的深入讲解
- Android 中java反射应用(三)——应用场景及总结
- 2010年Java高新技术A(2)反射
- 黑马程序员——Java高新技术之反射
- 在Domino平台上应用Java 反射机制
- Java高新技术【4】 反射机制 及 Java类加载原理及类加载器
- Java:描述反射机制的作用?举几个反射的应用?
- 黑马程序员——JAVA高新技术---反射--概述,类中构造方法、字段、方法和数组的反射,框架原理,JavaBean简述
- Java 反射技术及其应用