Java反射

来源:互联网 发布:淘宝网天天特价女棉衣 编辑:程序博客网 时间:2024/04/26 21:12
      JAVA反射机制是在运行状态中,对于任意一个类,都能够得到这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
      简而言之,反射就是可以通过名称来得到对象(类,属性,方法)的技术。

一.获取类对应的Class对象

1. getClass()方式: Object类中的方法,每个类都拥有此方法,如:
String str = new String();Class cls = str.getClass();
2.类名.class方式,如:
Class cls = String.class;
3. Class.forName()方式,如:
try {Class cls = Class.forName("java.lang.String");} catch (ClassNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();}

二.构造一个类的实例

1. 调用无参的构造函数:
Class cls = Student.class;try {Student stu = (Student) cls.newInstance();} catch (InstantiationException | IllegalAccessException e) {// TODO Auto-generated catch blocke.printStackTrace();}
2. 调用有参的构造函数
try {Class cls = Class.forName("com.zero.Student");//指定参数的Class,来决定调用那个构造函数Constructor cons = cls.getConstructor(String.class, int.class);Student stu = (Student) cons.newInstance("zero", 10);} catch (InstantiationException | IllegalAccessException| ClassNotFoundException | NoSuchMethodException| SecurityException | IllegalArgumentException | InvocationTargetException e) {e.printStackTrace();}

三.对象的属性操作

try {Class cls = Student.class;// 首先得到classField[] fields = cls.getFields(); // 只能获取public修饰的fieldfor (Field field : fields) {System.out.println(field.getName());}fields = cls.getDeclaredFields(); // 获取所有声明过的fieldfor (Field field : fields) {System.out.println(field.getName());}Student stu = new Student("zero", 12);Field stuFiled = stu.getClass().getDeclaredField("name"); // 获取private的fieldstuFiled.setAccessible(true);// private访问权限打开,否则抛出java.lang.IllegalAccessExceptionSystem.out.println(stuFiled.get(stu));// 获取stu的nameStudent student = Student.class.newInstance();Field sFiled = Student.class.getDeclaredField("name");sFiled.setAccessible(true);sFiled.set(student, "zero123");// 为name字段设置值System.out.println(sFiled.get(student));} catch (Exception e) {// TODO: handle exceptione.printStackTrace();}

四.类方法操作

Method[] methods = Student.class.getMethods();for (Method method : methods) {// 只获取Student的public修饰的method,以及Object的public修饰的methodSystem.out.println(method.getName());}Method[] methodss = Student.class.getDeclaredMethods();for (Method method : methodss) { // 只获取Student所有的method,不包括Object的methodSystem.out.println(method.getName());}try {Student student = new Student();Method setMethod = student.getClass().getDeclaredMethod("setGender", String.class);//获取参数为String的setGender方法setMethod.invoke(student,"man");Method getMethod = student.getClass().getDeclaredMethod("getGender");//获取getGender方法getMethod.setAccessible(true);//getGender方法是private,应该打开访问权限String gender = (String) getMethod.invoke(student);System.out.println(gender);} catch (Exception e) {e.printStackTrace();}

0 0
原创粉丝点击