本文共 2024 字,大约阅读时间需要 6 分钟。
序言:类的加载机制与反射密切相关,我将介绍类的加载与Class对象的关系,并且在最后说明反射的作用。(当用到Class对象时,通常就是在使用反射!)
反射的基本思想:
1)什么叫类的加载?:当程序运行的时候(包括调用其静态方法、new() 等),JVM中的类加载器,首先把我们要使用的Java类加载到内存中。这里加载的是编译后的.class文件(可能在磁盘、网络上),并生成与之对应的java.lang.Class对象。每个类加载到内存中,仅会创建一个对应的Class对象(通过反射可获得Class对象)。这个Class对象保存了这个类有哪些成员(数据成员,方法成员)。
2)Class对象:就是当类加载的时候,就会在内存中创建Class对象,通过Class对象可以获得该类的属性和方法。重点1:1个类可以创建多个该类的对象,但只会创建1个Class类的对象(马上证明)。创建一个User类(方便演示):
package Reflect;public class User { public int id; protected int age; private String uname; public User(){ } public User(int id, int age, String uname) { super(); this.id = id; this.age = age; this.uname = uname; } public int getId() { return id; } public void setId(int id) { this.id = id; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getUname() { return uname; } public void setUname(String uname) { this.uname = uname; }}
举例:
常用的3种获取Class对象方法://User类的对象->获取Class对象Class u1=user1.getClass();//User类获取Class对象Class u3=User.class;//通过包+类名获取Class对象(最常用)Class u4=Class.forName("Reflect.User");//举例Class i1=int.class;
验证(重点1):
//加载User类User user1=new User(1,18,"xiaowang1");User user2=new User(2,18,"xiaowang2");//获取反射对象Class u1=user1.getClass();//getClass()为Object基类的方法Class u2=user2.getClass();//判断u1、u2是否为同一对象System.out.println(u1==u2); //true
练习:
int[] arr01=new int[10];int[] arr02=new int[30];System.out.println(arr01.getClass().hashCode()==arr02.getClass().hashCode());//true int[] arr03=new int[10];int[][] arr04=new int[10][10];System.out.println(arr03.getClass().hashCode()==arr04.getClass().hashCode());//false
小结:
1.User类可以创建多个对象,但1个类只会创建1个Class对象。 2.这里用了getClass()获取Class对象,该方法为Object基类的方法。 3.体会练习中的题目,查看api。
那么Java反射有什么作用呢?
假如我们有两个程序员,一个程序员在写程序的时候,需要使用第二个程序员所写的类,但第二个程序员并没完成他所写的类。那么第一个程序员的代码能否通过编译呢?这是不能通过编译的。利用Java反射的机制,就可以让第一个程序员在没有得到第二个程序员所写的类的时候,来完成自身代码的编译。
Java的反射机制它知道类的基本结构,这种对Java类结构探知的能力,我们称为Java类的“自审”。大家都用过Jcreator和eclipse。当我们构建出一个对象的时候,去调用该对象的方法和属性的时候。一按点,编译工具就会自动的把该对象能够使用的所有的方法和属性全部都列出来,供用户进行选择。这就是利用了Java反射的原理,是对我们创建对象的探知、自审。
转载地址:https://blog.csdn.net/qq_41877184/article/details/94060113 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!