反射操作普通方法:
之前我们使用了反射操作构造方法,步骤是先取得构造方法,而且使用到一个表示构造方法的类型,普通方法也一样需要先使用Class类对象取得普通方法,同时也需要一个类表示普通方法,这个类是“java.lang.reflect.Method”。
先使用Class类对象取得普通方法:
public Method[] getMethods() throws SecurityException
【取得所有public修饰普通方法】
public Method getMethod(String name, Class<?>… parameterTypes)
【取得指定的public修饰的方法,第一个参数表示的是方法名称,第二个参数表示的是方法参数的Class类类型,主要是用来区分重载方法】
public Method getDeclaredMethod(String name, Class<?>… parameterTypes)
【取得指定的任意方法,第一个参数表示的是方法名称,第二个参数表示的是方法参数的Class类类型,主要是用来区分重载方法】
以上所有方法的返回值都使用Method类表示的,当取得方法之后还需要使用该类中的方法实现我们取得的方法的调用,该类中的方法我们关注一个即可:
public String getName()
【取得方法名称】
public Object invoke(Object obj, Object… args)
【调用方法,第一个参数:表示该方法作用对象,第二个参数表示:调用方法需要传递的参数】
操作普通方法:
package com.sun;
import com.sun.vo.Emp;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Date;
public class Test {
public static void main(String[] args) throws Exception {
//取得反射对象
Class<?> empClass=Class.forName("com.sun.vo.Emp");
//创建一个Emp对象
Emp emp=(Emp)empClass.getConstructor(Integer.class,String.class).newInstance(1001,"张三");
//取得指定的方法(setEname())
Method setEname=empClass.getMethod("setEname", String.class);
//执行setEname()方法
setEname.invoke(emp,"铁坚");
//取得getEname()方法
Method getEname=empClass.getMethod("getEname");
//调用getEname()方法
System.out.println(getEname.invoke(emp));
}
}
观察以下代码:
private void setEname(String ename) {
this.ename = ename;
}
private String getEname() {
return ename;
}
此时不能使用getMethod方法取得私有方法,它只能取得public修饰的方法,要使用getDeclaredMethod方法才能获取私有方法。
取得私有方法:
package com.sun;
import com.sun.vo.Emp;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Date;
public class Test {
public static void main(String[] args) throws Exception {
//取得反射对象
Class<?> empClass=Class.forName("com.sun.vo.Emp");
//创建一个Emp对象
Emp emp=(Emp)empClass.getConstructor(Integer.class,String.class).newInstance(1001,"张三");
//取得指定的方法(setEname())
Method setEname=empClass.getDeclaredMethod("setEname", String.class);
//执行setEname()方法
setEname.invoke(emp,"铁坚");
//取得getEname()方法
Method getEname=empClass.getDeclaredMethod("getEname");
//调用getEname()方法
System.out.println(getEname.invoke(emp));
}
}
以上已经取得了私有方法,但是不能调用,因为他是private修饰的,那么如果要调用,需要取消私有封装。
取消封装:
package com.sun;
import com.sun.vo.Emp;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Date;
public class Test {
public static void main(String[] args) throws Exception {
//取得反射对象
Class<?> empClass=Class.forName("com.sun.vo.Emp");
//创建一个Emp对象
Emp emp=(Emp)empClass.getConstructor(Integer.class,String.class).newInstance(1001,"张三");
//取得指定的方法(setEname())
Method setEname=empClass.getDeclaredMethod("setEname", String.class);
//执行setEname()方法
setEname.setAccessible(true);
setEname.invoke(emp,"铁坚");
//取得getEname()方法
Method getEname=empClass.getDeclaredMethod("getEname");
//调用getEname()方法
getEname.setAccessible(true);
System.out.println(getEname.invoke(emp));
}
}
总结:
1.可以通过堆区的Class对象取得方法,取得的方法使用一个类“Method”类表示
2.如果要执行方法需要使用Method的invoke(Object,Class…parameters)
【第一个参数:表示方法作用的对象,第二个参数:调用方法需要传递的参数的Class类类型】
3.私有方法需要使用getDeclaredMethod()方法取得,取得之后如果要调用需要取消私有封装