JAVA对象,类的关系以及它们在JVM中的位置
左边是方法区,类存放在方法区
中间是栈,存放类的引用
右边是堆,存放对象
Class是说明书的说明书,它告诉了我们说明书该怎么写,比如可以有方法,属性,构造方法等
我们写的class都是说明书,比如可以有哪些方法,哪些属性,如Dog类,User类
使用Class对象(类对象)实例化一个对象
Class类包含了类的信息,如构造方法、方法、属性,可用于反射
如何使用Java的反射?
1).通过一个全限类名创建一个对象
Class.forName(“全限类名”); 例如:com.mysql.jdbc.Driver Driver类已经被加载到 jvm中,并且完成了类的初始化工作就行了
类名.class; 获取Class<?> clz 对象
对象.getClass();
2).获取构造器对象,通过构造器new出一个对象
Clazz.getConstructor([String.class]);
Con.newInstance([参数]);
通过class对象创建一个实例对象(就相当与new类名()无参构造器)
Cls.newInstance();
3).通过class对象获得一个属性对象
Field c=cls.getFields():获得某个类的所有的公共(public)的字段,包括父类中的字段。
Field c=cls.getDeclaredFields():获得某个类的所有声明的字段,即包括public、private和proteced,但是 不包括父类的声明字段
4).通过class对象获得一个方法对象
Cls.getMethod(“方法名”,class……parameaType);(只能获取公共的)
Cls.getDeclareMethod(“方法名”);(获取任意修饰的方法,不能执行私有)
M.setAccessible(true);(让私有的方法可以执行)
让方法执行
1). Method.invoke(obj实例对象,obj可变参数);-----(是有返回值的)
当前方法,
这个是Person类里面有个eat方法,参数是String
先获取Person类的Class对象
再获取指定名称的方法,用方法名和方法参数类型的Class
传入对象和参数,执行方法
用传统的OOP思想来说,任何一个你写好的且编译过的生成的Class文件,在被类加载器加载后,都会对应有一个java.lang.Class这个类的实例。所以说,每个类的自有的方法属性(类结构)自然被包含在了这个对应的实例上,因此就可以获取到。