网站建设有创意,制作html网站,网站建设与管理课后总结,做网站怎么租个空间Java内存到反射入门(一)初识Java内存平常我们最常提到的的JAVA分区是这三个分区其中方法区是一个特殊的堆#xff0c;功能如图上所示。初识反射#xff1a;框架设计的灵魂反射的功能#xff1a;将类的各个组成部分封装为对象#xff0c;并在程序运行的过程中可以调用它们。…Java内存到反射入门(一)初识Java内存平常我们最常提到的的JAVA分区是这三个分区其中方法区是一个特殊的堆功能如图上所示。初识反射框架设计的灵魂反射的功能将类的各个组成部分封装为对象并在程序运行的过程中可以调用它们。Java代码的三个阶段我们平时书写的java代码从书写完成到内存中执行主要经历了三个阶段Source 源代码阶段class类对象阶段Runtime运行时阶段。下图以一个简单的Person类来举例说明。第一阶段Source源代码阶段首先我们编写好了一个Person类的代码,它由成员变量构造方法成员方法三部分组成。public class Person{private String name;private int age;public Person(){}public void eat(){}}此时它是一个Person.java文件。还不能运行接着我们要用javac命令编译它使生成一个Person.Class字节码文件。 这个文件我们并不能看懂其实里面主要包含三部分内容成员变量成员方法和构造方法还有一些诸如包名的信息。至此源代码和字节码都是以文件的形式储存在硬盘上的还未进入内存此阶段我们称之为Source源代码阶段。第二阶段Class类对象阶段要想由第一个阶段进入第二个阶段要经过一个加载的过程。由类加载器ClassLoder将class文件加载到内存中并生成该类的class类对象。class类对象是来描述字节码文件的字节码文件被封装为三大部分1.成员变量被封装为Field对象并用Filed[]存储。2.构造方法被封装为Constructor对象并用Constructor[]存储。3.成员方法被封装为Method对象并用Method[]存储。这样的封装就是反射机制经过了这样的封装后我们就可以在程序运行的过程中来操作这些对象了。即获取修改变量和执行方法等。举个栗子在IDEA等IDE中写如下一段代码://定义了一个字符串变量并尝试调用它自带的方法String str abc;str.在按下str后面这个.后IDEA会提示许多的方法。 那么为什么IDEA会提示这些方法呢其实内部就是反射机制。 定义了一个String变量后则字符串的字节码文件就会被加载进内存。在内存中就有了String的class类对象里面封装了Method[]存储了所有String的方法。所以只要挨个显示一下就可以了。 第三阶段Runtime运行时阶段第二阶段通过创建对象等操作就会进入第三阶段创建对象时就会根据这个class类对象创建一个真正的Person对象。获得class类的三种方法Class.forName(全类名)将字节码文件加载进内存返回Class对象 * 多用于配置文件将类名定义在配置文件中。读取文件加载类//如获取Person类的.Class文件Class a Class.forName(Domain.Person);//Domian是Person类所在包类名.class通过类名的属性class获取,该方法多用于参数的传递。Class a Person.calss;对象.getClass()getClass()方法在Object类中定义着,该方法多用于对象的获取字节码的方式Person person new Person();Class a person.getClass();Tip同一个字节码文件(*.class)在一次程序运行过程中只会被加载一次不论通过哪一种方式获取的Class对象都是同一个。//采用多种方式得到.Class文件Class a Class.forName(Domain.Person);Person person1 new Person();Person person2 new Person();Class b person1.getClass();Class c Person.class;Class d person2.getClass();//不管以哪种方式得到的.Class类只要是Person类的那就是一样的。System.out.println(ab); //trueSystem.out.println(cb); //trueSystem.out.println(ac); //trueSystem.out.println(ad); //trueClass类的用法在熟悉了Class类的获取方法后自然要熟悉其用法。//以下是测试用的Person类public class Person {private String name;private int age;private int id;public Person() {}public Person(String name, int age, int id) {this.name name;this.age age;this.id id;}public String getName() {return name;}public void setName(String name) {this.name name;}public int getAge() {return age;}public void setAge(int age) {this.age age;}public int getId() {return id;}public void setId(int id) {this.id id;}Overridepublic String toString() {return Person{ name \ name \ \\ , age \ age , id \ id };}}用法一获取类的名字方法有两个String getName(); //返回类的包名类名String getSimpleName();//获取简单类名Class c1 Person.class;System.out.println(c1.getName()); //该方法获取类的全名输出Domain.PersonSystem.out.println(c1.getSimpleName());//该方法获取类的简单名即Person用法二获得类的属性方法有四个Field[] getFields() 获取所有public修饰的成员变量Field getField(String name) 获取指定名称的 public修饰的成员变量Field[] getDeclaredFields() 获取所有的成员变量不考虑修饰符Field getDeclaredField(String name)用法三获得类的方法方法有四个Method[] getMethods() ;Method getMethod(String name, 类... parameterTypes) ;Method[] getDeclaredMethods() ;Method getDeclaredMethod(String name, 类... parameterTypes) ; 注意第一个方法会获取包括本类和父类的所有public方法。 第二个方法只会获取本类的所有方法包括private的不包括父类的方法。 获取指定方法的第一个参数是方法的名称第二个参数是要获取的方法的参数类型,如setName(String name);函数参数是String则此处写String.Class;用法四获得构造器(构造方法)有四种方法获取构造方法们Constructor[] getConstructors()Constructor getConstructor(类... parameterTypes)Constructor getDeclaredConstructor(类... parameterTypes)Constructor[] getDeclaredConstructors() ;