通过反射调用普通方法:
通过反射,调用类中的方法,通过Method类完成:
步骤:
1:通过Class类的getMethod(String name,Class...parameterTypes)方法取得一个Method对象,并设置此方法操作时所需要的参数类型。 2:之后使用Object invoke(Object obj, Objectll args)进行调用,并向方法中传递要设置的obj对象的参数信息。
Object invoke(Object obj, Object … args):
Object 对应原方法的返回值:
若原方法无返回值,此时返回null 若原方法若为静态方法,此时形参Object obj可为null 若原方法形参列表为空,则Object[] args为null 若原方法声明为private,则需要在调用此invoke()方法前: 显式调用方法对象的setAccessible(true)方法,才能访问private的方法
举例:
package Collections; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; public class person_text { public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, InvocationTargetException, NoSuchMethodException { //获得Class对象 Class c1 = Class.forName("Collections.person"); //通过反射,调用普通方法 person user3 =(person)c1.newInstance(); //通过反射获取一个方法 Method setName = c1.getDeclaredMethod("setName",String.class); setName.invoke(user3 ,"Lisa");//invoke:激活---->(对象,"方法的值") System.out.println(user3.getName()); } }
输出:
Lisa
通过反射操作属性:
package Collections; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import static java.lang.reflect.AccessibleObject.setAccessible; public class person_text { public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, InvocationTargetException, NoSuchMethodException, NoSuchFieldException { //获得Class对象 Class c1 = Class.forName("Collections.person"); //通过反射操作属性 person user4 =(person)c1.newInstance(); Field name =c1.getDeclaredField("name"); //不能直接操作私有属性 ,我们需要关闭程序的安全检测 //属性或者方法.setAccessible(true); name.setAccessible(true); name.set(user4,"jason"); System.out.println(user4.getName()); } }
输出:
jason
setAccessible:
Method和Field、Constructr对象都有setAccessible()方法.
setAccessible作用是启动和禁用访问安全检查的开关
参数值为true,则指示反射的对象在使用时应该取消Java语言访问检查,这样做的目的是:
1:提高反射的效率。如果代码中必须用反射,而该句代码需要频繁的被调用,那么将其参数值设置为true 2: 使得原本无法访问的私有成员也可以访问
参数值为false,则指示反射的对象应该实施Java语言访问检查