整理了一下通过反射获取java中的方法、成员变量、构造函数的方法:
假设我们有一个类为Student:
public class Student {
private int age;
private String name;
public String addr;
public Student(int age, String name, String addr) {
this.age = age;
this.name = name;
this.addr = addr;
}
public Student(int age, String name) {
this.age = age;
this.name = name;
}
private Student(int age) {
this.age = age;
}
public Student() {
}
private int method1(){
return 0;
}
private int method2(int age){
return age;
}
public void print(String name,int age){
System.out.println("hello:"+name+"年龄:"+age);
}
public String print2(String name,int age){
System.out.println("hello:"+name+"年龄:"+age);
return null;
}
@Override
public String toString() {
return "Student [age=" + age + ", name=" + name + ", addr=" + addr
+ "]";
}
}
1.获得Student中方法:
Student student = new Student();
Class studentClass = student.getClass();
// getDeclaredMethods得到本类中所有方法
Method[] studentMethods = studentClass.getMethods();
System.out.println("方法个数:"+studentMethods.length);
for (Method method : studentMethods) {
//得到返回类型
System.out.print("方法名称和参数:"+method.getName()+"(");
//取得某个方法对应的参数类型数组
Class[] paramsType = method.getParameterTypes();
for (Class paramType : paramsType) {
System.out.print(paramType.getTypeName()+" ");
}
System.out.print(")");
Class returnType = method.getReturnType();
System.out.println("返回类型:"+returnType.getTypeName());
}运行结果:
但是我们Student中不是还有method1和method2方法吗? 如果我们想要取到private修饰的方法 那我们可以使用getDeclaredMethods()来得到:
2.通过名称和参数类型确定对应的方法并执行:
//通过方法名称和方法参数确定一个方法
//getMethod(“MethodName”,paramsTypes)得到的public的方法
Method method = studentClass.getMethod("print", String.class,int.class);
method.invoke(student,"张三", 23);
结果:
这里值得注意的是:如果我们的变量studentClass是使用Student.class.getClass();直接得到的话,那会抛出java.lang.NoSuchMethodException: java.lang.Class.print(java.lang.String,
int)的错误,我们不能使用一个没有实例化的对象来寻找里面的方法。
3.得到构造方法:
Constructor[] cs2 = Student.class.getConstructors();
System.out.println("构造方法个数:"+cs2.length);
for (Constructor constructor : cs2) {
String printstr = "(";
//获取某个构造方法中的参数数组
Class[] paramsType = constructor.getParameterTypes();
for (Class parameter : paramsType) {
printstr = printstr+parameter.getTypeName()+",";
}
if(printstr.length()>2){
printstr = printstr.substring(0, printstr.length()-1);
}
System.out.println(printstr+")");
}
结果:
我们要得到private修饰的构造参数时使用:Student.class.getDeclaredConstructors();
4.通过构造方法实例化对象
//实例化构造方法实例化对象
Constructor constructor = Student.class.getConstructor(int.class,String.class);
Student student2 = constructor.newInstance(new Object[]{23,"李四"});
//Student student2 = constructor.newInstance(23,"李四");
//因为newInstance参数是... 所以上面方式传参也可以 传递的参数要和确定构造方法的参数类型一致
System.out.println(student2.toString());
结果:
5.获取类中field信息:
//getFields()方法获取的是所有的public的信息
//getDeclaredFields()获取的是该类自己声明的成员变量信息
Class stuClass = Student.class;
Field[] fs = stuClass.getDeclaredFields();
for(Field field : fs){
//得到类的变量的类型的类类型
Class fieldType = field.getType();
String fieldTypeStr = fieldType.getName();
//得到成员变量的名称
String fieldname = field.getName();
System.out.println("类型:"+fieldTypeStr+"名称:"+fieldname);
}
结果:
如果我们使用的是getFields()那我们只能得到一个:类型:java.lang.String名称:addr的参数