Java增强_反射的总结
来源:互联网 发布:汽车dsp调音数据参考 编辑:程序博客网 时间:2024/06/05 11:17
一、反射概述Class
1)反射的基石->Class类,Java程序中的各个Java类属于同一类事物,描述这类事物的Java类名就是Class,而类是用来描述对象的。
2)众多的人用一个什么类表示?众多的Java类用一个什么类表示?
①人-Person
②Java类-->Class
3)Person类代表人,它的实例对象就是张三、李四这样的一个个具体的人。Class类代表Java类,它的各个实例对象又分别对应着什么呢?
①对应各个类在内存中的字节码,例如,Person类的字节码,ArrayList类的字节码等等
②一个类被类加载器加载到内存中,占用了一片内存空间,这个空间里面的内容就是类的字节码,不同的类的字节码是不同的 ,所以它们在内存中占的内容是不同的,这一个一个的空间可以分别用一个个对象来标示,这些对象显然具有相同的类型,这个类型是什么了?Class类型
4)如何得到各个字节码对应的实例对象(Class类型),三种方式:
①类名.class,例如System.class
②对象.getClass(),例如 new Date().getClass();
③Class.for.name(“完整类名”),例如Class.forName(“java.util.Date”);
5)九个预定义的Class实例对象
八个基本数据类型的Class实例和void的实例
6)对反射的理解:
反射:类是对对象的抽象,而反射类Class又是对所有类的抽象,将所有类的共性信息提取出来,组成一个类。或者说,反射类是为java类服务的,而java类是为象服务的。
7).Java类用于描述一类事物的共性,该类事物有什么属性,没有什么属性,至于这个属性的值是什么,则是由这个类的实例对象来确定的。不同的实力对象有不同的属性值。Java程序中的各个Java类,它们是否属于同一类事物,是不是可以用一个类来描述这个类事物?这个类的名字就是Class,要注意与小写class关键字的区别哦。Class类描述了哪些方面的信息呢?类的名字,类的访问属性,类所属的包,字段名称的列表、方法名称列表,等等。学习反射,首先就要明白Class这个类。
二、反射构造函数Constructor
1)Constructor类代表某个类中的一个构造方法
①得到某个类的所有构造方法:
Constructor[] constructors=Class.forName(“java.lang.String”).getConstructors();
②得到某个类的某一个构造方法:
Constructor constructor=Class.forName(“java.lang.String”).getConstructor(StringBuffer.class);
//获取方法时要用到参数类型的class对象
③调用构造方法,实例对象:
>通常方式:String str=new String(new StringBuffer(“abc”));
>反射方式:constructor=Class.forName(“java.lang.String”).getConstructor(StringBuffer.class);
String str2=(String)constructor.newInstance(new StringBuffer(“abc”));
//调用构造器对象,要用到上面参数类型对应的实例对象
2)Class.NewInstance()方法:
①String obj=class.forName(“java.lang.String).newInstance()
class-->constructor--->new Object
class->new Object() (内部还是创建了一个默认的构造器对象)
三、反射字段Field
1)创建一个类如下,有私有字段。
public class Point {private int x;public int y;public Point(int x, int y) {super();this.x = x;this.y = y;}@Overridepublic String toString() {// TODO Auto-generated method stubreturn str1+":"+str2+":"+str3;}}
2)实现反射公有字段和私有字段
①公有字段
Point p1=new Point(3,5);
Field fy=p1.getClass().getField("y");//返回可访问字段,封装了y字段信息的一个对象
/field不是对象上的变量,而是类上的。
System.out.println(fy+":"+fy.get(p1));
②私有字段
Field fx=p1.getClass().getDeclaredField("x");//返回声明的字段
fx.setAccessible(true);//暴力访问,可以访问私有的。
System.out.println(fx+":"+fx.get(p1));
四、反射成员方法Method
1)Method类代表某个类中的成员方法,而Method创建的对象就是具体的某个方法了。
①创建Method类对象,封装String的CharAt方法
Method methodCharAt=String.class.getMethod("charAt", int.class);
②使用String类对象,调用反射到的CharAt方法
String str1=”张三李四”;
System.out.println(methodCharAt.invoke(str1, 1));
③如果第一个参数为null,则表示通过Sting类调用其静态方法。
Method copyValueOf=String.class.getMethod("copyValueOf", char[].class);
System.out.println(copyValueOf.invoke(null, (Object)(new char[]{'a','b','c'})));
五、反射main方法
1)普通调用main的方式
TestArgument.main(new String[]{"a","b","c"});
2)反射调用main方法
String starClassName=”com.zsw.TestArgument”;Method mainMethod =Class.forName(starClassName).getMethod("main", String[].class);mainMethod.invoke(null, new Object[]{new String[]{"张111","222","333"}});//mainMethod.invoke(null, (Object)new String[]{"张111","222","333"});
3)JDK1.5的语法,反射调用方法时:当传递来的是一个数组,就会自动解包,为了防止数据出错。
① 将数组在封装到一个数组里面,解包后就是原始数据了。
②将数组强制转换成一个Object对象,编译器就认为其不是数组,就不会拆包了,以此欺骗编译器。
- Java增强_反射的总结
- java增强_枚举的总结
- java基础增强---反射
- java的反射总结
- java反射的总结
- Java反射的总结
- JAVA的反射总结
- 黑马程序员_学习笔记7可变参数的应用及1.5增强for的联合使用以及反射的总结
- 技术总结_反射
- 黑马程序员——java基础增强反射的学习
- 黑马程序员_笔记十七_基础增强之反射
- Java反射的理解总结
- 关于java反射的总结
- Java反射机制的总结
- Java反射的一点点总结
- Java反射的一些总结
- Java基础知识_反射
- java技术_反射
- 漫话中文自动分词和语义识别 - 中文分词算法
- 多线程的使用(1) - performSelectorOnMainThread
- spring3mvc与struts2比较
- 第十一次课后作业 作业一
- 德州扑克游戏算法讲解
- Java增强_反射的总结
- Android界面View及ViewGroup
- Unigui获取连接的客户端列表
- RISC和CISC的关系
- 多线程的使用(2) - NSOperation和NSOperationQueue
- java多线程处理
- GVIM乱码问题
- ural 1692 Flags for Provinces 解题报告
- 老婆需要的