一、 反射(modifiers(修饰符),fields(属性),methods(方法))
1、 概念:在程序运行时动态解析类的内部信息(注解【@override】、属性、方法)
2、 获取类信息的三种方法
(1)
Class:将类的信息封装成类(class中的类型是固定的)
Class class 对象
Field(属性) private Xxx valName= “name”
访问修饰符:private/default/protected/public
数据类型:boolean/char/…/Xxx
属性名称:valName
Method(类) public Xxx methodName(…){….}
访问修饰符:private/default/protected/public
返回类型:boolean/char/…/Xxx
方法名称:methodName
参数列表:Parameter
Constructor(构造方法) public className(…){…}
访问修饰符:
参数列表:Parameter
(2)
三种方法
①
Class c = ToolKit.class; //通过已知类型获取类型信息
②
ToolKit tl = new ToolKit;
Class c = tl.getClass(); //通过对象获取类型信息
③
Class c = Class.forName(String
classFullPath);//包的全包路径,获取类信息
3、 获取类名
(1)
String fullPathName =
c.getName(); //获取类全包路径
(2)
String simpleName =
c.getSimpleName(); //获取类的简名
4、 反射创建对象
(1)
通过无参构造创建对象:T t =
(T)c.newInstance();
(2)
获取当前类中的构造方法
Constructor cons
= c.getConstructor(Class<?>…paranterTypes);
T t =
(T)cons.newInstance(Object…paramenters);
5、 获取当前类中的自定义属性
(1)
Filed[] fs =
c.getDeclaredFields();
(2)
Filed f = ….
int modifiedNum = f.getModifies(); //获取属性访问修饰整数
0default;1:public;2:private;4:protected
Class c = f.getType(); //获取属性的类型信息
String typeName = c.getName(); //获取属性的类型名称
String fieldNmae = f.getName(); //获取属性的名称
f.setAccessible(boolean visible); //设置属性的可见性
f.set(T t,Xxx value); //给t对象的f属性赋值
E value = f.get(T t); //获取t对象f属性的值
6、 获取当前类中的自定义方法
(1)
Method[] ms =
c.getDeclaredMethods();
(2)
Method m = ….
String methodName = m.getName(); //获取方法名称
Class c = m.getReturnType(); //获取方法返回类型
String returnType = c.getName(); //获取方法返回类型名称
Classs[] parameterTypes = c.getParameterTpye();
//获取方法所有参数类型
m.setAccessible(boolean visible); //设置方法的可见性
E val =(E)m.invoke(T target,Object…params); //调用方法