反射是一种机制,指通关获取类的变量与方法信息来创建对象,再通过这个对象来调用方法。
class对象的获取方式有三种:
1.类名.class
2.对象名.getclass()
3.class.forName("类全名") 类全名是该类所在包下的包名+类名
我们也可以用getSimpleName()方法和getName方法分别活动类名和类全名。
实际代码如下:
运行出的结果意思是这三种方法都能获取相同的class类。
反射机制的目的是为了创建对象,首先我们来了解如何使用构造方法来创建对象。
查看api,我们能找到反射的的构造方法有:
1.Constructor getConstructor(Class... parameterTypes)//获取指定的单个构造方法,括号里根据是有参构造还是无参构造来按顺序填入参数类型,这种方法只能获取public修饰的方法。
2. Constructor getDeclaredConstructor(Class... parameterTypes)//获取指定的单个修饰方法,不受修饰词的影响。
3.Constructor[] getConstructors()和Constructor[] getDeclaredConstructors(),这两者返回的是一个数组,获取的是所有的对应构造方法。
获取到了构造方法后,我们就可以通过构造方法后我们就可以用构造方法来创建对象了。
使用constructor的方法 newInstance(Object... initargs),括号里也是根据有参还是无参来按顺序填入参数
使用无参构造方法来创建student对象。至此,反射的机制就算是运行成功了。
除了构造方法外,构成一个类的部分还有它的成员方法和成员变量。
获取成员方法,是为了调用成员方法,要用到Method类和它的常用方法:
Method getMethod(String name,Class...args);
Method getDeclaredMethod(String name,Class...args);
Method[] getMethods();
Method[] getDeclaredMethods();
调用方法则要用到:
Object invoke(Object obj, Object... args)
obj:调用方法所使用的对象,如果是静态方法可以传入null
args:调用方法时传递的参数【实参】
void setAccessible(true) 因为被private和protected修饰的方法在通常情况下是无法被访问的,所以要设置"暴力访问"来取消权限,true取消权限,false表示不取消。