黑马程序员------java基础加强中反射
2014-10-29 11:08
375 查看
------Java培训、Android训、iOS培训、Net培训、期待与您交流!------
一、反射定义:
就是把Java类中各种成分反射成相应的java类。
二、获得Class对象
如何得到各个字节码对应的实例对象?
每个类被加载后,系统会为该类生成对应的Class对象,通过Class对象可以访问到JVM中的这个类,3种方式:
1、调用某个类的class属性获取Class对象,如Date.class会返回Date类对应的Class对象(其实就是得到一个类的一份字节码文件);
2、使用Class类的forName(String className)静态方法,className表示全限定名;如String的全限定名:java.lang.String;
3、调用某个对象的getClass()方法。该方法属于Object类;
Class<?>clz = new Date().getClass();
代码实例:
public class ClassDemo1 {
public static void main(String[] args)throws Exception {
//获得Class对象的方法(三种)
//一:调用属性
Class<String> c = String.class;
System.out.println(c);//打印结果:class java.lang.String
//String.class就表示JVM中一份表示String类的字节码
Class<String> c2 = String.class;
System.out.println(c == c2);//true都是String类的字节码 一个类在虚拟机中只有一份字节码;
//二:使用forName()方法
//Class cla = Class.forName("String");//ERROR,
Class<String> cla =(Class<String>)Class.forName("java.lang.String");
//必须用上全限定名,否则报错
System.out.println(c == cla);//true
//三:利用对象调用Object的getClass方法;
Class c3 = new String().getClass();
System.out.println(c == c3);//ture
}
}
三、九个预定义Class对象
基本的 Java 类型(boolean、byte、char、short、int、long、float 和 double)和关键字 void通过class属性也表示为 Class 对象;
Class类中boolean isPrimitive() :判定指定的 Class 对象是否表示一个基本类型。
包装类和Void类的静态TYPE字段;
Integer.TYPE == int.class ;
Integer.class == int.class;
数组类型的Class实例对象:
Class<String[]> clz = String[].class;
数组的Class对象如何比较是否相等? 数组的维数和数组的类型;
Class类中 boolean isArray() :判定此 Class 对象是否表示一个数组类型。
代码实现:
public class PreClassDemo2 {
public static void main(String[] args) {
Class<?> in = int.class;
System.out.println(in);//int
Class<?> in2 = Integer.class;
//包装类都有一个常量TYPE,用来表示其基本数据类型的字节码
Class<?> in3 = Integer.TYPE;
System.out.println(in2);//class java.lang.Integer
System.out.println(in3);//int
System.out.println(in3 == in);
//true包装类都有一个常量TYPE,用来表示其基本数据类型的字节码,所以这里会相等!
System.out.println(in3 == in2);//false
Class<String[]> s = String [].class;
Class<int[]> i =
int [].class;
//System.out.println(i ==s);//编译根本就通过不了,一个是int,一个是String
}
//这两个自定义的方法是可以的,一个int,一个Integer//包装类与基本数据类型的字节码是不一样的
public void show(int i){}
public void show(Integer i){}
}
四、总结
通过上面内容的学习,了解了反射的定义及其含义,学会了三种可以得到各个字节码对应的实例对象(Class类型)(1) 类名.class,例如,System.class(2)对象.getClass(),例如,newDate().getClass();
(3)Class.forName(“类名”),例如:Class.forName(“java.util.Date”);但是在平常运用中,获取Class对象最常用的是利用属性的方法。了解了九种预定义的Class对象,学会了判定指定的 Class 对象是否表示一个基本类型或者数组类型等。在今后学习中,应学会熟记并运用这些知识,。
------Java培训、Android训、iOS培训、Net培训、期待与您交流!------
相关文章推荐
- 黑马程序员-JAVA基础加强-反射2
- 黑马程序员--Java基础加强--10.【PropertyDescriptor操作JavaBean VS 反射操作Java类】【个人总结】
- 黑马程序员---java基础加强_成员变量的反射
- 黑马程序员_张孝祥_Java基础加强_反射
- 黑马程序员java学习<基础加强>—反射
- 黑马程序员--JAVA基础加强之反射技术
- 黑马程序员--Java基础加强--15.利用反射操作泛型IV【通过反射Method解析泛型方法思路】【通过Method对四种Type子接口类型进行解剖】【使用递归对任意复合泛型类型进行彻底解剖】【个人
- 黑马程序员_Java基础加强_反射
- 黑马程序员-JAVA基础加强之反射
- 黑马程序员_java基础加强-枚举和反射
- 黑马程序员 20 Java基础加强-02-反射篇
- 黑马程序员--Java基础加强--13.利用反射操作泛型II【TypeVariable】【GenericArrayType】【WildcardType】【Type及其子接口的来历】【个人总结】
- 『黑马程序员』---java--基础加强--反射+内省
- 黑马程序员-Java基础加强-反射
- 黑马程序员--Java基础加强--07.【反射创建对象 操作字段 调用方法的异同】【个人总结】
- 黑马程序员--Java基础加强--12.利用反射操作泛型I【与反射+泛型相关的接口类型综述】【Type】【ParameterizedType】【个人总结】
- 黑马程序员-Java基础加强之反射
- 黑马程序员_java基础加强_静态导入_反射_枚举_注解_内省_泛型_代理
- 【黑马程序员】Java基础加强15:反射Reflect
- 黑马程序员--Java基础加强学习笔记之Class类、反射(Reflect)