Java反射中 ,方法的反射操作是通过Method对象调用invoke(对象,参数)方法,之前我们需要知道怎样来确定一个方法?
注:通过方法名和参数列表我们可以唯一确定一个方法。
首先我们获取方法就是获取类中的信息,获取类的信息需要得到类类型,因此我们通过已知A的实例对象a1,调用getClass()方法得到A类类型,然后调用getMethod方法获取到Method对象,然后Method对象调用invoke()方法。
整个流程:
一、已知A类,通过实例对象a1获取类类型
class A{
public void print() {
System.out.println("hello world");
}
public void print(int a, int b) {
System.out.println(a+b);
}
public void print(String a, String b) {
System.out.println(a.toUpperCase()+","+b.toLowerCase());
}
}
TestA a1 = new TestA();
//通过对象获取类的类类型,可以获取到类的信息
Class class1 = a1.getClass();
二、获取Method对象
Method m1 = class1.getMethod("print", int.class, int.class);
源码中getMethod(String name, Class<?>... parameterTypes),第一个参数为方法的名称,第二个是参数列表,在这我们可以通过两种方法来表示
1、int.class, int.class
2、new Class[]{int.class, int.class}——》数组的方式
这两种方式结果都是一样的。
三、通过Method对象调用invoke()方法
源码中invoke方法返回值默认是Object,如果通过反射操作的方法有返回值且不是Object,需要进行强制转换;如果操作的对象没有返回值类型,则返回null。
代码奉上:
/**
* 方法的反射实际应用,即:通过类类型获取方法对象,再通过方法对象进行反射操作。
* 注:方法的名称和参数列表唯一确定某一个方法
* method.invoke(对象,参数)
*/
public class MethodReflectDemo {
public static void main(String[] args) {
A a1 = new A();
//通过对象获取类的类类型,可以获取到类的信息
Class class1 = a1.getClass();
//通过方法的名称和参数列表唯一确定一个方法
try {
//通过getMethod()方法获取方法对象,在这里可以通过两种方法获取
// Method me = class1.getMethod("print", new Class[]{int.class, int.class});
Method me = class1.getMethod("print", int.class, int.class);
//通过invoke()方法进行方法的反射操作,其是指通过Method对象对方法进行操作
//invoke()其实是有返回值的,当方法如果没有返回值类型(void)则返回null,如果有返回值类型则返回对应的返回值类型(默认是Object,需要做强制类型转换)
// Object object = me.invoke(a1, new Object[]{10,20});//传递数组方式
Object object = me.invoke(a1, 10,20);
System.out.println("*************************");
// Method me1 = class1.getMethod("print", new Class[]{String.class, String.class});
Method me1 = class1.getMethod("print", String.class, String.class);
object = me1.invoke(a1, "hello", "WORLD");
System.out.println("*************************");
// Method me2 = class1.getMethod("print", new Class[]{});
Method me2 = class1.getMethod("print");
object = me2.invoke(a1);
System.out.println("*************************");
Method m3 = class1.getMethod("print", String.class);
String s = (String)m3.invoke(a1, "方法的反射操作");
System.out.println(s);
} catch (Exception e) {
e.printStackTrace();
}
}
}
class A{
public void print() {
System.out.println("hello world");
}
public void print(int a, int b) {
System.out.println(a+b);
}
public void print(String a, String b) {
System.out.println(a.toUpperCase()+","+b.toLowerCase());
}
public String print(String s) {
return s;
}
}
输出结果:
30
*************************
HELLO,world
*************************
hello world
*************************
方法的反射操作
我们在实际应用中的方法反射操作
一、已知一个实体类,通过属性名,获取其属性值。实现的原理就是:通过字符串拼接Javabean中的方法,进行方法反射方法的操作。
已知的实体类UserReflect。
public class UserReflect {
private String name;
private String sex;
private int age;
public UserReflect(String name, String sex, int age) {
super();
this.name = name;
this.sex = sex;
this.age = age;
}
public UserReflect() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
封装方法反射方法的操作
/**
* 根据对象的属性名获取对象的属性值。
* 我们是通过字符串拼接成javaBean里的get方法名,然后通过方法反射执行方法。
*/
public class ReflectApplyMethod {
public static Object getValueByPropertyName(Object object, String propertyName) {
Object value = null;
//拼接Javabean中的方法,得到方法名
String action = "get"+propertyName.substring(0, 1).toUpperCase()+propertyName.substring(1);
System.out.println("方法名:"+action);
//通过已知对象object得到类类型
Class class1 = object.getClass();
//获取Method对象,get方法都是public,所有使用getMethod()
try {
Method m = class1.getMethod(action);
value = m.invoke(object);
} catch (Exception e) {
e.printStackTrace();
}
return value;
}
public static void main(String[] args) {
//主函数调用通过属性名获取属性值的方法
UserReflect uReflect = new UserReflect("Tom", "男", 20);
System.out.println(getValueByPropertyName(uReflect, "name"));
System.out.println(getValueByPropertyName(uReflect, "sex"));
System.out.println(getValueByPropertyName(uReflect, "age"));
}
}
主函数输出结果:
方法名:getName
Tom
方法名:getSex
男
方法名:getAge
20