- 1、本文档共7页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Java反射
1、反射的基石(Class类
1.1Java程序中的各个Java类属于同一类事物,描述这类事物的Java类名就是Class。
1.2对比提问,众多的人用一个Person类表示,众多的类用什么表示?
人(Person
Java类(Class
1.3对比提问:Person类代表人,它的实例对象就是张三,李四这样一个个具体的人,Class类代表Java类,它的各个实例对象又分别表示什么呢?
对应各个类在内存中的字节码,例如,Person类的字节码,ArrayList类的字节码,等等...
一个类被类加载器加载到内存中,占用一片存储空间,这个空间里面的内容就是类的字节码,不同的类的字节码是不同的,所以他们在内存中的内容是不同的,这一个个的空间可以分别用一个个的对象来表示,这些对象显然具有相同的类型,那么这个类型又是什么呢?
1.4得到类字节码实例对象(Class类型)的三种方法
类名.class Eg:System.class
对象.getClass() Eg:new Data().getClass()
Class.forName(“类名”) Eg:Class.forName(“java.util.Date”);
1.5九个预定义Class实例对象:
有九种预定义的 Class 对象,表示八个基本类型和 void。这些类对象由 Java 虚拟机创建,与其表示的基本类型同名,即 boolean、byte、char、short、int、long、float 和 double。Constructor[] constructors = Class.forName(java.lang.String).getConstructors();
3.3得到某一个构造方法:
Eg:Constructor constructor =
Class.forName(java.lang.String).getConstructor(StringBuffer.class);
3.4创建实例对象:
常规方式:String str = new String(“abc”);
反射方式:String str = (String)constructor.newInstance(new StringBuffer(“abc”));
3.5Class.newInstance()方法
Eg: String str = (String)Class.forName(java.lang.String).newInstance();
该方法内部先得到默认的构造方法,然后用该方法创建实例对象。
该方法的内部代码用到了缓存机制来保存默认构造方法的实例对象。
4 Field类
4.1Field类代表某一个类中的一个成员变量
4.2演示代码
public class ReflectPoint {
private int x;
public int y;
public ReflectPoint(int x, int y) {
super();
this.x = x;
this.y = y;
}
}
ReflectPoint p1 = new ReflectPoint(3,5);
Field fieldY = p1.getClass().getField(y);
//fieldY的值是多少?是5?错!fieldY不是对象身上的变量,而是类上,要用它 //去取 某个对象上对应的值。
System.out.println( fieldY.get(p1) );
Field fieldX = p1.getClass().getDeclaredField(x);
//暴力反射
fieldX.setAccessible(true);
System.out.println( fieldX.get(p1) );Field fieldX = p1.getClass().getField(x);
Exception in thread main java.lang.NoSuchFieldException: x
at java.lang.Class.getField(Class.java:1520)
at my.ceh.reflect.ReflectTest.main(ReflectTest.java:12)
不加 fieldX.setAccessible(true); 这行代码
5
Exception in thread main java.lang.IllegalAccessException: Class my.ceh.reflect.ReflectTest can
您可能关注的文档
- BOOK 8 UNIT 1 A land of diversity导学案.doc
- book1 uit5学案.doc
- Book1Unt1 Friendship Reading1课件.ppt
- book2unt2教学设计.doc
- Book3Unt1Reading教学设计.doc
- book4 uit2教案.doc
- Book4Unt3课件.ppt
- Book4Unt4阅读课资料.doc
- Book5 uit1学案.doc
- book5 uit2单词课件.ppt
- 新高考生物二轮复习讲练测第6讲 遗传的分子基础(检测) (原卷版).docx
- 新高考生物二轮复习讲练测第12讲 生物与环境(检测)(原卷版).docx
- 新高考生物二轮复习讲练测第3讲 酶和ATP(检测)(原卷版).docx
- 新高考生物二轮复习讲练测第9讲 神经调节与体液调节(检测)(原卷版).docx
- 新高考生物二轮复习讲练测第11讲 植物生命活动的调节(讲练)(原卷版).docx
- 新高考生物二轮复习讲练测第8讲 生物的变异、育种与进化(检测)(原卷版).docx
- 新高考生物二轮复习讲练测第5讲 细胞的分裂、分化、衰老和死亡(讲练)(原卷版).docx
- 新高考生物二轮复习讲练测第5讲 细胞的分裂、分化、衰老和死亡(检测)(原卷版).docx
- 新高考生物二轮复习讲练测第12讲 生物与环境(讲练)(原卷版).docx
- 新高考生物二轮复习讲练测第11讲 植物生命活动的调节(检测)(原卷版).docx
文档评论(0)