getMethods方法
——返回的是一个方法的数组
通过类对象的getMethods()方法获取的结果
仔细观察发现:获取的方法全是public的,没有私有方法
而wait()、hashcode()、notify()方法则是继承来的
getDeclaredMethods()
——返回的是一个方法的数组
我们如果想获取私有方法,类对象还有一种方法getDeclaredMethods
仔细观察,获取了私有的方法,而且没有了继承来的方法了
invoke方法的调用
反射调用无参方法 eat()
我们正常调用方法使用的是 对象.方法名,所以我们可以通过类对象先获取对象,这里就是通过newInstance方法获取了bread对象。然后使用invoke方法,相当于 . 的作用
运行:
反射调用 toString()
和上面的eat()类似,但是,上面不用写一个对象来接收,这里需要,因为toString()是有返回值的
,
执行结果
调用带参的eat()
在getMethod方法里指定参数的类型
然后在invoke方法调用的时候将参数传入进去
打印结果:
获取私有的方法
注意这里需要使用的方法不再是getMethod()而是要使用getDeclaredMethod()
然后运行:报错。因为私有的方法只能在本类中使用,所以我们要设置访问权限失效
privateMethod.setAccessible(true);
运行测试:
获取静态方法
静态方法,先想一下我们正常是如何调用的,我们是使用类名.方法名,并没有使用到对象,所以我们可以这么写,省略获取对象的过程newInstance()
再写一个 可以调用任何对象方法的通用方法
public static Object invokeAny(Object obj,String methodName,Class<?>[] types,Object...args) throws Exception{
//获取类对象
Class<?> class1 = obj.getClass();
//获取方法
Method method = class1.getMethod(methodName, types);
//调用
return method.invoke(method, args);
}
获取类的属性
我们使用getFields(),由于属性不是公开的,所以我们获取不到
当我们使用getDeclaredFields(),可以获取私有的属性
我们来获取单个属性的值,并设置,并取出来
正常我们要获取属性的值,调用的是对象.属性,所以在这里我们还是要先创建出对象newInstance()
注意:当ID修改为private属性时
调用时,我们还是要使用setAccessible(true);