反射

一、什么是反射?
运行时动态调用一个对象所有变量和方法的机制叫做反射

二、反射过程
反射第一步:获取Class对象
Person person=new Person
1.已有对象-通过对象获得:
Class c=对象名.getClass();
2.通过路径:
Class c=Class.forName("这里填入src下的类路径");
3.通过类名.Class:
Class c=Person.Class;
4.基本内置属性的包装类都有一个TYPE属性,可以用于获取Class:
Class c=Interge.TYPE;
5.可以通过获得的Class的getSuperClass方法获取这个类的父类的Class:
Class c2=c.getSuperClass();

哪些类型有Class对象?
class,interface,数组,,enum(枚举),annotation(注解-通过反射运行时执行注解),基本数据类型,void

反射第二步:获取类名和属性-只能获取独属于自己的属性,无法获得父类的属性,要获取父类的属性要getSuperClass
获取包名+类名
c.getName();
获取类名
c.getSimpleName();
获取全部public属性
Field[] fields=c.getFields();
获取全部属性
Field[] fields=c.getDeclaredFields();
获取指定属性
getField("name")
getDeclaredField("name")

反射第三步:获取方法和构造器
获取public方法,包含父类的方法
Method[] method=c.getMethods();
获取所有方法--只获取独属于这个类的所有方法
Mehtod[] method=c.getDeclaredMethods();
获取指定方法
方法名+方法输入参数的Class(重载-同方法名,但是参数不同,为了区分要输入参数class)
Method method=c.getMethod("name",String.class)
Method method=c.getDeclaredMethod("name",String.class)
获取public构造器-只有自己的构造器,没有父类的构造器
Constructor[] constructors=c.getConstructors();
获取所有构造器
Constructor[] constructors=c.getDeclaredConstructors();
获取指定的构造器
Constructor constructor=c.getConstructor("name",String.class);
Constructor constructor=c.getDeclaredConstructor("name",String.class);

反射第四步:动态创建对象
调用c的无参构造方法创建对象,使用c.newInstance的c必须要有无参构造方法
User user=(User)c.newInstance();
通过构造器来创建对象,使用参数的构造方法构造对象
Constructor constructor=c.getDeclaredConstructor("name",String.class); User user = (User)constructor.newInstance("Hello World");

反射第五步:通过对象调用方法
通过m.invoke(c,"方法参数")或者f.set(c,"值")。如果是私有,需要f.setAccessible(true);关闭程序安全,再操作私有属性

三、总结:
1.Class c=User.Class;或者Class c=Class.forName("相对路径");等得Class
2.User u=(User)c.newInstance();无参创建对象或者c.getConstructor(String.class).newInstance("构造参数")创建对象
Method m=c.getMethod();或者Field f=c.getField();等获取属性或者方法
4.通过m.invoke(c,"方法参数")或者f.set(c,"值")。如果是私有,需要f.setAccessible(true);关闭程序安全,再操作私有属性

posted @ 2021-07-10 10:01  世界时停  阅读(179)  评论(0)    收藏  举报