反射reflect,面向对象的变成思想
类 从很多对象中抽取出来的公有的特征行为 抽象描述 用来描述一组对象
对象 现实生活中 先存在了好多对象 很多相同特征 相同行为
类是用来描述一组对象
反射机制认为是用来描述一组类
可以与之前学习File对比着学习
Class 用来描述类本身
Package 用来描述类所属的包
Field 用来描述类中的属性
Method 用来描述类中的方法
Constructor 用来描述类中的构造方法
Annotation 用来描述类中的注解
如何获取Class
通过获取类直接操作类里面的东西
如下三种方式
Class clazz = Class.forName("包名.类名");//需要抛出异常 创建文件自带的src不写包名 java.lang.String
Class clazz = 类名.class; //String.class
Class clazz = 对象.getClass();//Object类中的方法
Class中的常用方法
1.int result = getModifiers(); 获取类的修饰符(权限 特征)
如果两个修饰符都有 返回的是两个修饰符代表整数之和
每一个修饰符 用一个整数来进行表示
0开始---0 1 2 4 8 16 32 64 128 256 512
0--默认不写 1--public 2--private 4--protected
8--static 16--final 32--synchronized 64--volatile
128--transient 256--native 512--interface 1024--abstract
2.String name = getName();获取名字(包名+类名)
3.String simpleName = getSimpleName();简单名(类名)
4.Package p = getPackage();
p.getName();//获取包名
5.Class sclazz = getSuperClass();//获取超类(父类)
6.Class[] classes = getInterfaces();//当前所有classes的所有父类接口
查看ArrayList中所有父类的接口
Class c=ArrayList.class;//获取ArrayList的类
Class[] clazz=c.getInterfaces();//调用方法 最后遍历输出
7.Object obj = newInstance();//默认调用无参数构造方法创建对象
Person p=(Person)obj;//需要造型
若类中不存在无参数的构造方法 抛出异常NoSuchMethodException
8.Field f = getField("属性名");
Field[] fs = getFields();
如上的两个方法只能获取公有的属性 但是包含继承过来的父类属性
9.getDeclaredField("属性名");
Field[] fs = getDeclaredFields();
如上的两个方法能获取公有的和私有的属性 但是只能获取本类中的属性
10.Class[] =getClasses(); 获取类中的内部类
Field类中的常用方法
int = getModifers()//获取属性的修饰符
Class = getType()//获取属性的类型
String = getName()//获取属性的名字
操作属性 向里面存值
set(对象,值)
操作属性 从里面取值
值 = get(对象) 需要造型 获取到的get对象的属性是什么参数类型是造成什么类型的
//得到的是当前属性的值
setAccessable(true); //没有进行设置这个就不能修改私有属性的值 也不能通过get直接得到私有属性的值
直接修改私有属性会出现一个异常 illegalAccessException
如何操作类中的方法
Class类中的方法
Method m = class.getMethod("方法名",Class...参数类型);//参数类型.class 获取公有的方法(自己类+父类)
Method[] = clazz.getMethods(); 获取所有的方法(公有 自己+父类)
Method = getDeclaredMethod("方法名字",参数类型的class...) 获取一个方法(自己类 公有 私有)
Method[] = getDeclaredMethods(); 获取全部的方法(自己类 公有 私有)
若方法是私有的方法 不允许操作
可以设置setAccessable(true) 设置方法使用权 准入
获取构造方法
Constructor = clazz.getConstructor(Class...参数类型)//参数类型.class
Constructor[] cons = clazz.getConstructors();
clazz.getDeclaredConstructor();
clazz.getDeclaredConstructors();
Method类中的常用
int mm = m.getModifiers();//获取方法的修饰符(权限+特征)
Class mrt = m.getReturnType();//获取返回值数据类型
String mn = m.getName();//获取方法的名字
Class[] mpts = m.getParameterTypes();//获取方法参数列表的类型
Class[] mets = m.getExceptionTypes();//获取方法抛出异常的类型
Parameter[] parameters = m.getParameters();//获取方法参数列表 如何操作方法
调用方法 让他执行一次
Object result = invoke(对象,执行方法需要传递的所有参数...);
//如果方法没有参数就不写,如果参数类型是String类型就在里面传一个字符串类型的
Constructor类中的常用方法
con.getModifiers();
con.getName();
con.getParameterTypes();
con.getExceptionTypes();
如何操作构造方法
执行一次 创建对象
Object = con.newInstance(执行构造方法时的所有参数);
con.setAccessible(true); //操作私有的构造方法