淘先锋技术网

首页 1 2 3 4 5 6 7

整理了一下通过反射获取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<Student> 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的参数