您的位置:首页 > 编程语言 > Java开发

java反射基本使用(得到类中属性、方法、构造方法)

2016-08-09 11:46 656 查看
整理了一下通过反射获取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的参数
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: