反射快速入门

打印 上一主题 下一主题

主题 821|帖子 821|积分 2463

反射就是通过字节码文件获取类的成员变量、构造方法和成员方法的全部信息。
利用反射,我们可以获取成员变量的修饰符、名字、类型、取值。我们可以获取构造方法的名字、形参,并利用通过反射获取的构造方法创建对象。我们可以获取成员方法的修饰符、名字、形参、返回值、抛出的非常、注解,并运行通过反射获取的方法。

比如idea中的自动提示就是通过反射获取的,idea通过反射获取该对象的全部能调用的方法,并将它显示出来,又比如idea中函数的形参提示也是通过反射获取的。
反射是通过字节码文件对象获取成员变量、成员方法、构造方法的全部信息,所以,我们先要获取字节码文件对象,再去从字节码文件对象中获取成员变量、构造方法和成员方法,最后再进行剖解获取全部信息。
获取class对象的3种方式:
  1. (1)class.forName("全类名");
  2. (2)类名.class;
  3. (3)对象.getClass();
复制代码
那我们应该如何选择呢?
创建一个类的对象,我们需要履历以下3个阶段:

  • 源代码阶段:Java->class,在这个阶段,虚拟机是没有把代码加载到内存当中的,全都是硬盘中进行操作。在这个阶段用第一种方式获取class字节码文件对象。第一种方式最为常用。
  • 加载阶段:把字节码文件加载到内存中。这个阶段使用第二种方式来获取字节码文件对象。第二种方式通常都是当作参数进行传递。
  • 运行阶段:在该阶段使用第三种方式。当我们已经有了这个类的对象时才可以使用第三种方式。
利用反射获取构造方法:
  1. Constructor<?>[] getConstructors()//返回所有公共构造方法对象的数组
  2. Constructor<?>[] getDeclaredConstructors()//返回所有构造方法对象的数组
  3. Constructor<T> getConstructor(Class<?>..parameterTypes)//返回单个公共构造方法对象
  4. Constructor<T> getDeclaredConstructor(Class<?>.. parameterTypes)//返回单个构造方法对象
  5. T newInstance(Object... initargs)//根据指定的构造方法创建对象
  6. setAccessible(boolean flag)//设置为true可以绕过访问控制权限,使得 private 属性或方法也可以被访问。
  7. //setAccessible(boolean flag)使用示例
  8. public class Example {
  9.     private String privateField = "privateValue";
  10. }
  11. public class AnotherClass {
  12.     public static void main(String[] args) throws Exception {
  13.         Example instance = new Example();
  14.         Field field = Example.class.getDeclaredField("privateField");
  15.         field.setAccessible(true);
  16.         System.out.println("Private Field Value: " + field.get(instance)); // 可以通过反射访问私有字段
  17.     }
  18. }
复制代码
Class类中用于获取成员变量的方法:
  1. Field[] getFields()//返回所有公共成员变量对象的数组
  2. Field[] getDeclaredFields()//返回所有成员变量对象的数组
  3. Field getField(String name)//返回单个公共成员变量对象
  4. Field getDeclaredField(Stringname)//返回单个成员变量对象
  5. void set(Object obj, Object value)//给成员变量赋值
  6. Object get(Object obj)//获取成员变量的值。
  7. setAccessible(boolean flag)//使用 setAccessible(true) 可以绕过访问控制权限,使得 private 属性或方法也可以被访问。
  8. //set,get示例
  9. public class Example {
  10.     private String name;
  11.     private int age;
  12.     public static void main(String[] args) throws Exception {
  13.         Example example = new Example();
  14.         Field nameField = Example.class.getDeclaredField("name");
  15.         Field ageField = Example.class.getDeclaredField("age");
  16.         // 设置字段值
  17.         nameField.set(example, "John Doe");
  18.         ageField.set(example, 30);
  19.         // 获取字段值
  20.         System.out.println("Name: " + nameField.get(example));
  21.         System.out.println("Age: " + ageField.get(example));
  22.     }
  23. }
复制代码
Class类中用于获取成员方法的方法:
  1. Method[] getMethods()//返回类中所有公共成员方法对象的数组,包括继承的
  2. Method[] getDeclaredMethods()//返回类中所有成员方法对象的数组,不包括继承的
  3. Method getMethod(String name, Class<?>... parameterTypes)//返回单个公共成员方法对象
  4. Method getDeclaredMethod(String name, Class<?>... parameterTypes)//返回单个成员方法对象
  5. Object invoke(Object obj,Object... args)//运行方法
  6. //参数一:用obj对象调用该方法
  7. //参数二:调用方法的传递的参数(如果没有就不写)
  8. //返回值:方法的返回值(如果没有就不写)
  9. setAccessible(boolean flag)//使用 setAccessible(true) 可以绕过访问控制权限,使得 private 属性或方法也可以被访问。
  10. //invoke使用示例:
  11. public class Example {
  12.     public void greet(String name) {
  13.         System.out.println("Hello, " + name + "!");
  14.     }
  15.     public static void main(String[] args) throws Exception {
  16.         Example example = new Example();
  17.         Method method = Example.class.getMethod("greet", String.class);
  18.         // 调用 greet 方法
  19.         method.invoke(example, "John");
  20.     }
  21. }
复制代码
注意:获取公共方法时也会获取父类中的全部公共方法。获取全部权限的方法时,就不会获取父类的方法

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

张国伟

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表