java反射基本使用(得到类中属性、方法、构造方法)
2016-08-09 11:46
656 查看
整理了一下通过反射获取java中的方法、成员变量、构造函数的方法:
假设我们有一个类为Student:
1.获得Student中方法:
但是我们Student中不是还有method1和method2方法吗? 如果我们想要取到private修饰的方法 那我们可以使用getDeclaredMethods()来得到:
2.通过名称和参数类型确定对应的方法并执行:
结果:
这里值得注意的是:如果我们的变量studentClass是使用Student.class.getClass();直接得到的话,那会抛出java.lang.NoSuchMethodException: java.lang.Class.print(java.lang.String,
int)的错误,我们不能使用一个没有实例化的对象来寻找里面的方法。
3.得到构造方法:
结果:
我们要得到private修饰的构造参数时使用:Student.class.getDeclaredConstructors();
4.通过构造方法实例化对象
结果:
5.获取类中field信息:
结果:
如果我们使用的是getFields()那我们只能得到一个:类型:java.lang.String名称:addr的参数
假设我们有一个类为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的参数
相关文章推荐
- Java访问私有属性(不使用getter方法和反射)
- [java]反射机制给属性使用set方法构造对象
- java再复习——通过反射使用类的属性,方法和构造器
- Java反射:根据属性名得到其Set方法设置它的值
- Java反射基本使用方法 示例
- Java反射基本概述及使用方法
- java中反射的基本使用方法
- java中反射基本的方法以及使用
- java使用反射给对象属性赋值的两种方法
- java使用反射给对象属性赋值的两种方法
- java基于反射得到对象属性值的方法
- [java]反射机制给属性使用set方法构造对象
- Java 使用反射获取类、方法、属性上的注释
- java 反射 基本知识——属性和方法
- java 通过反射机制得到类的属性和方法
- java中memcached基本使用方法
- JAVA反射使用实例和class.getResource()得到URL中含有中文和空格乱码问题
- 利用java的反射机制调用类的私有方法及私有属性
- 使用反射调用类型成员 方法,字段,属性
- 使用反射操作私有(Private)方法和属性