最开始学习反射的时候接触到了Class字节码的概念,这和源代码直接编译成二进制机器码的C/C++很不相同。有一些惊讶,增加字节码这一层次后,除了跨平台这个最重要功用外,Class字节码还能够被搭积木装配,由此延伸出反射、bean、内省、注解等等操作,而JavaEE框架也几乎主要建立在这个搭积木装配基础之上。我估计Java语言最初的设计者没有料到这后面的发展吧。
编译和执行过程是:源代码定义的类--->可装配的Class字节码定义的类--->识别字节码的虚拟机。中间的可装配的Class字节码定义的类意味着我们不写源代码,也可以生成一个类,并给它配备属性和存取方法。Class字节码的具体格式一张表,包含常数表,属性表,方法表等等,吻合我们的想象。另外还有一个好玩的特征字“CafeBabe”。
Java用Class类来描述可装配的Class字节码定义的类,得到这个Class即可获得其中的属性和方法。Class类的获取方法有三种:
获取Class类----通过类名
Class c = Class.forName("cn.itcast.day29.apple");
Fruit f = (Fruit) c.newInstance();
获取Class类----通过类直接获取
Class c = Apple.class;
获取Class类----通过实例获取
Class c = apple.getClass();
调用特定的构造函数
Class clazz = Class.forName("cn.itcast.day29.domain.Person");
Constructor c = c.getConstructor(String.class, int.class); //获取指定类型参数的构造函数
Person p = (Person)c.newInstance("某某", 21);
获取Class包含的所有可见方法
Method[] arr = clazz.getMethods();
获取Class包含的所有方法,包括不可见的方法
Method[] arr = clazz.getDeclaredMethods();
获取特定方法
Method m = clazz.getMethod("run", int.class);
Method m = Person.class.getMethod("run", int.class);
还可以运行特定方法
Class clazz = Class.forName("cn.itcast.day29.domain.Person");
Person p = (Person)clazz.newInstance();
Method m = p.getMethod("setName", String.class);
m.invoke(p, "某某");
修改当前类的私有方法为公有
m.setAccessible(true);
获取属性数据
跟Method非常类似,不再重复罗列
一个有点思路相近的概念是Javabean,特征是这个类的属性及其存取方法规范化,构造函数规范化,由此,当一个Javabean被送入另外一个模块的时候,由于这个通行规范,无须添加额外说明,对方可以闭眼操作这个Javabean。
编译和执行过程是:源代码定义的类--->可装配的Class字节码定义的类--->识别字节码的虚拟机。中间的可装配的Class字节码定义的类意味着我们不写源代码,也可以生成一个类,并给它配备属性和存取方法。Class字节码的具体格式一张表,包含常数表,属性表,方法表等等,吻合我们的想象。另外还有一个好玩的特征字“CafeBabe”。
Java用Class类来描述可装配的Class字节码定义的类,得到这个Class即可获得其中的属性和方法。Class类的获取方法有三种:
获取Class类----通过类名
Class c = Class.forName("cn.itcast.day29.apple");
Fruit f = (Fruit) c.newInstance();
获取Class类----通过类直接获取
Class c = Apple.class;
获取Class类----通过实例获取
Class c = apple.getClass();
一个类往往具有如下元素:构造函数、属性、方法。
得到Class类之后可以获取Class包含的所有的构造函数
Constructor[] arr = c.getConstructors();调用特定的构造函数
Class clazz = Class.forName("cn.itcast.day29.domain.Person");
Constructor c = c.getConstructor(String.class, int.class); //获取指定类型参数的构造函数
Person p = (Person)c.newInstance("某某", 21);
获取Class包含的所有可见方法
Method[] arr = clazz.getMethods();
获取Class包含的所有方法,包括不可见的方法
Method[] arr = clazz.getDeclaredMethods();
获取特定方法
Method m = clazz.getMethod("run", int.class);
Method m = Person.class.getMethod("run", int.class);
还可以运行特定方法
Class clazz = Class.forName("cn.itcast.day29.domain.Person");
Person p = (Person)clazz.newInstance();
Method m = p.getMethod("setName", String.class);
m.invoke(p, "某某");
修改当前类的私有方法为公有
m.setAccessible(true);
获取属性数据
跟Method非常类似,不再重复罗列
一个有点思路相近的概念是Javabean,特征是这个类的属性及其存取方法规范化,构造函数规范化,由此,当一个Javabean被送入另外一个模块的时候,由于这个通行规范,无须添加额外说明,对方可以闭眼操作这个Javabean。