一、反射是什么
在类加载的时候,堆中会产生一个Class类型的对象。每一个类只有一个Class对象,我们可以通过Class对象,看清楚类的结构。这个就是所谓的反射。
二、如何使用反射
首先获取class类对象
获取所需构造器
通过构造器创建对象
获取方法对象
调用方法
获取属性对象
输出
三、具体操作
首先获取class类对象
共有4中方式
在编译阶段:
Class<?> aClass = Class.forName("Dog.java");
Class类加载阶段:
Class<Dog> dogClass = Dog.class;
在运行阶段:
Class<?> aClass1 = dog.getClass();
通过类加载器:
ClassLoaderclassLoader= Practice0.class.getClassLoader();
Classs= classLoader.loadClass("全类名");
2.获取构造器
获取无参构造器为对象:
Object o = cla.newInstance();
获取有参public构造器对象:
Constructor<?> constructor = cla.getConstructor(String.class, String.class);
Object o1 = constructor.newInstance("1", "2");
获取有参private构造器对象:
Constructor<?> constructor1 = cla.getDeclaredConstructor(String.class, int.class);
constructor1.setAccessible(true);//反射爆破
Object o2 = constructor.newInstance("1", 1);
3.调用方法
根据方法名和参数获取public方法对象:
Method method = cla.getMethod("qqq", String.class);
method.invoke(o,"name");
根据方法名和参数获取private方法对象:
Method method = cla.getDeclaredMethod("qqq", String.class);
method.setAccessible(true);
method.invoke(o,"name");
访问成员
访问public的属性:
Field name = cla.getField("sal");
name.set(o,88);
System.out.println(name.get(o));
访问private的属性
Field name = cla.getDeclaredField("name")
name.setAccessible(true);
name.set(o,"aa");
System.out.println(name.get(o));
4.访问static属性和方法
method.invoke(null,参数)
name.set(null,参数)
name.get(nill)
应为静态方法跟属性,对于该类所有对象来说都是一样的。