----------------------android培训、java培训、java学习型技术博客、期待与您交流!----------------------
反射的基石——Class类:
Java程序中的各个Java类属于同一类事物,描述这类事物的Java类名就是Class,Class类的各个实例对象分别对应的是各个类在内存中的字节码。一个类被类加载器加载到内存中,占用一片存储空间,这个空间里面的内容就是类的字节码,不同的类的字节码是不同的,所以它们在内存中的内容是不同的,这一个个的空间可分别用一个个的对象来表示,这些对象显然具有相同的类型,这个类型就是Class类型。
有3种方法可以得到各个字节码对应的实例对象
1.类名.class,例如,System.class
2.对象.getClass(),例如,new Date().getClass()
3.Class.forName("类名"),例如,Class.forName("java.util.Date");
反射:
反射就是把Java类中的各种成分映射成相应的java类。例如,一个Java类中用一个Class类的对象来表示,一个类中的组成部分:成员变量,方法,构造方法,包等等信息也用一个个的Java类来表示,就像汽车是一个类,汽车中的发动机,变速箱等等也是一个个的类。表示java类的Class类显然要提供一系列的方法,来获得其中的变量,方法,构造方法,修饰符,包等信息,这些信息就是用相应类的实例对象来表示,它们是Field、Method、Contructor、Package等等。
===============================Constructor类===============================
1.Constructor类代表某个类中的一个构造方法
得到某个类中的所有的构造方法(不包括私有的构造方法):
Constructor[ ] constructors= Class.forName("java.lang.String").getConstructors();
得到某一个构造方法:
Constructor constructor = Class.forName(“java.lang.String”).getConstructor(StringBuffer.class);
如果getConstructor()方法中没有任何值,说明调用的是默认的构造方法
创建实例对象:
通常方式:String str = new String(new StringBuffer("abc"));
反射方式:String str = (String)constructor.newInstance(new StringBuffer("abc"));
=================================Method类================================
2.Method类代表某个类中的一个成员方法
得到某个类中的所有成员方法(不包括私有的成员方法):
Method[ ] methods = Class.forName("java.lang.String").getMethods();
得到某一个成员方法:
Method charAt = Class.forName("java.lang.String").getMethod("charAt", int.class);
如果传递给Method的对象的invoke()方法的第一个参数为null,则说明该Method对象对应的是一个静态方法
调用方法:
通常方式:String str = new String(new StringBuffer("abc"));
反射方式:System.out.println(charAt.invoke(str, 1));
==================================Field类================================
3.Field类代表某个类中的成员变量
得到某个类中的所有成员变量(不包括私有的成员变量):
Field[] fields = Class.forName("java.lang.String").getFields();
得到某一个成员变量:
Field field = Class.forName("className").getField("fieldName");
以下面的Person为例
public class Student { public String name; }
获得变量:
通常方式:System.out.println(new Student().name);
反射方式:System.out.println(Class.forName("cn.itcast.day1.Student").getField("name").
get(new Student()));
数组的反射:
具有相同维数和元素类型的数组属于同一个类型,即具有相同的Class实例对象
int[] a1 = new int[3];
int[] a2 = new int[4];
System.out.println(a1.getClass() == a2.getClass()); //返回true
代表数组的Class实例对象的getSuperClass()方法返回的父类为Object类对应的Class
int[] a1 = new int[3];
System.out.println(a1.getClass().getSuperclass().getName()); //java.lang.Object
基本类型的一维数组可以被当作Object类型使用,不能当作Object[]类型使用;非基本类型的一维数组,既可以当做Object类型使用,又可以当做Object[]类型使用
int[] a1 = new int[3];
Object[] aobj1 = a1; //int是基本类型,不是Object类型,会报错
String[] a2 = new String[]{"a", "b", "c"};
Object[] aobj2 = a2;
利用反射获取数组的值:
private static void readObject(Object obj) {
if (obj.getClass().isArray()) {
int len = Array.getLength(obj);
for (int i = 0; i < len; i++){
System.out.print(Array.get(obj, i));
}
} else {
System.out.println(obj);
}
}
----------------------android培训、java培训、java学习型技术博客、期待与您交流!----------------------
详情请查看:http://edu.csdn.net/heima
分享到:
相关推荐
黑马程序员-java32期培训视频(基础+就业)黑马程序员-java32期培训视频(基础+就业)
黑马程序员 - Java基础教学 - 03 - 变量的作用域、for循环、break、continue、内存结构
day03_List、Set、数据结构、Collections day04_Map,斗地主案例 day05_异常,线程 day06_线程、同步 day07_等待与唤醒案例、线程池、Lambda表达式 day08_File类、递归 day09_字节流、字符流 day10_缓冲流、转换流、...
黑马程序员 - Java基础教学 - 05 - 面向对象(1).doc
黑马程序员 - Java基础教学 - 04 - 数组、进制转换、二维数组
黑马程序员-SpringCloud-学习笔记-03-Eureka注册中心
黑马程序员 - Java基础教学 - 08 - 面向对象(4)-多态.doc
黑马程序员 - 毕向东 - Java基础教学 - 第02天 个人观看视频总结文档
黑马程序员 - 毕向东 - Java基础教学 - 第01天 个人观看视频总结文档
黑马程序员 - Java基础教学 - 06 - 面向对象(2) - 关于静态static的那些事.doc
NULL 博文链接:https://huangminwen.iteye.com/blog/1157983
黑马程序员-SpringCloud-学习笔记01-认识微服务
黑马QT讲义,适合QT入门,使用,教程很比较基础,新手可以看看,另外视频链接在哔哩哔哩中。
黑马程序员-SpringCloud-学习笔记-02-微服务拆分及远程调用
黑马程序员--毕向东全套Java视屏,讲解的相当全面,各位如果需要,尽快下载哦! 另外如果视频链接存在打不开的问题,请留言,必定及时更新链接。
月薪过万的入门必知知识,黑马程序员入学Java精华总结
黑马程序员-梅兰商城项目实战,包含图片素材和编写源码。
C++黑马程序员-演讲比赛流程管理系统记录
Java 黑马程序员入学Java知识(精华总结)
NULL 博文链接:https://840198532-qq-com.iteye.com/blog/1490901