- 1、说说对Class类的理解
- 2、说说Class/Java动态加载类
- 3、通过反射获取类的方法、变量等
- 4、方法的反射
1.说说对Class类的理解
我们都是知道java是面向对象的,但是呢,java中有两种不是面向对象的存在,一种是基本数据类型int a=5;所以基本数据类型都提供了包装类型,还有一种就是静态成员。
那么,我们写的类是对象吗。我们写的每一个类也是对象,是java.lang.Class的对象,比如我们写了一个Student类,他本身就是Class类的实例对象。
看下Class类的源码就知道,他的构造方法是private,只有jvm去创建Class类的实例对象。
所以,任何一个类都是Class的实例对象,这个实例对象有三种表示方法:
第一种,类名.class
这实际上是说,任何一个类都有一个隐含的静态成员变量class
Class class1=Student.class;
第二种,用类对象去获取
student是用Student new出来的
Class class2=student.getClass();
在官网上的说法是,class1和class2表示的是Student的类类型。
这句话要怎么理解:类也是对象,是Class类的实例对象,这个对象(我们的类)称为Class的类类型。
第三种
Class c3=null;
c3=Class.forName ("com.stu.Student");
我们完全可以通过类的类类型创建该类的实例对象,通过c1,c2,c3创建Student类的实例。
可以通过c1.newInstance();//必须要有无参数的构造方法,因为默认会调用
2.说说Class/Java动态加载类
首先,什么是动态加载、什么是静态加载。
编译时刻加载类是静态加载,运行时刻加载类是动态加载类。
用new创建对象,是静态加载类,在编译时刻就需要加载所有可能使用到的类。这是不太好的,可能我们真正需要的类已经存在了。
通过动态加载类可以解决这个问题,就是在运行的时候加载。在编译的时候不会报错。只有我把具体的类当参数传进去,如果没有才报错。
下面就是动态加载类:
不仅代表类类型,还代表动态加载类
Class class1=Class.forName("类名");
通过类类型创建对象
但是这里要注意,强制类型转换,可能我们传进来的不是Student呢,所以我们可以让可能传入的类去实现同一个接口,只要写一个接口的名字就可以。
这样的话,以后再来一个Person类,我们不需要去修改原来的类,只需要让心来的Person类实现那个统一的接口。
就像软件升级,以前的代码不需要改,如果改的话就要重新编译,所以不需要我们重新下载全新的代码去编译,都是添加一些实现统一接口的新的类,动态加载。
Student stu=(Student)class1.newInstance();
一般功能性的类都采用动态加载。
3.通过反射获取类的方法、变量等
我们来看看基本数据类型有没有类类型呢?
Class c=int.class;//是存在的,但和Integer.class完全不一样
String.class是String的类类型,也可以说是String类的字节码
还有很多关键字,比如void。
我们可以通过类类型去拿到类的所有方法,类类型就是String.class,Student.class
import java.lang.reflect.Method;
public class ClassUtil {
public static void printClassMsg(Object obj){
//要获取类的信息,首先要拿到类的类类型,我们从obj传入类
Class c=obj.getClass();
c.getName();//拿到类的全名
/**
* 万物皆对象,一个成员对象也是Method对象
* getMethods()也可以拿到所有public方法和从父类继承来的
*/
Method[] methods=c.getMethods();
}
public static void main(String[] args) {
}
}
不仅类里面的成员函数是对象,成员变量也是对象,java.lang. reflect.Field封装了对成员变量的操作。
4、方法的反射
如何获取某个方法:方法的名称和参数列表可以唯一决定一个方法。重载就是同名参数列表不同。
方法的反射操作:method.invoke(对象,参数列表)
5、范性的本质,什么是范性,范性什么时候有效
通过Class,Method认识范性的本质
反射都是编译之后的操作,都是要拿到字节码之后的操作。
编译之后的集合是去范性化的,java中集合的范性是防止错误输入的,只在编译阶段有效,绕过编译就无效了。
java内存模型
内存模型的作用是屏蔽各种硬件和操作系统的差异。
网友评论