扫盲java基础-反射(二)

简介: 扫盲java基础-反射(二)

反射的基础-常用的方法

  首先看下Class类:

1:这个Class类的父类还是Object类,这个类也是一个最终类,Class类没有公共构造方法,Class对象是在加载类时由Java虚拟机以及通过调用类加载器中的defineClass方法自动构造的。这个Class对象是由java虚拟机来创建的。


2:常用的方法有哪些:怎样通过反射来获取一个类中的信息。

2.1、要想获取到类中的信息,必须得到Class对象

获取Class的对象有几种方式:

A:通过本身的class属性获取:

  1. System.out.println(StudentDemo.class);

B:通过类对应实例获取(自动补全:CTRL+2,l)

  1.    StudentDemo studentDemo1 = new  StudentDemo();
  2.    System.out.println(studentDemo1.getClass());

C : 通过Class类中提供的静态forName方法获取

  1.   Class  clazz=Class.forName("com.weizhaoyang.Student.StudentDemo");
  2.    System.out.println(clazz);

2.2、获取一个Class对象中的成员变量:

A、 获取所有的由public修饰的成员变量,代码如下:

  1.    Class clazz = StudentDemo.class;
  2.    // 获取所有的由public修饰的成员变量
  3.    Field[] fields = clazz.getFields();
  4.    for (Field field : fields) {
  5.        System.out.println(field);
  6.    }

运行的结果如下:public:访问修饰符,java.lang.String:字段类型  

com.weizhaoyang.Student.StudentDemo.cats:字段名称

B、获取当前Class对应类中所有定义的成员变量,代码如下:

  1.    fields = clazz.getDeclaredFields();
  2.        for (Field field : fields) {
  3.            System.out.println(field);
  4.            System.out.println("访问修饰符:" + Modifier.toString(field.getModifiers()));
  5.            System.out.println("字段类型:" + field.getType().getTypeName());
  6.            System.out.println("字段类型简单名称:" + field.getType().getSimpleName());
  7.            System.out.println("字段名称:" + field.getName());
  8.        }

运行的结果如下:

C、如何获取一个私有的字段从而给设置值:

  1.   // 通过Class对象创建类实例
  2.        Object instance = clazz.newInstance(); // Object stu = new Student();
  3.        // 单独获取一个字段
  4.        Field field = clazz.getDeclaredField("age");
  5.        // 开启任何字段访问权限
  6.        field.setAccessible(true);
  7.        // 设置私有字段的值
  8.        field.set(instance, 25);
  9.        // 通过反射获取字段的值
  10.         Object value = field.get(instance);
  11.         System.out.println(value);

运行的结果如下:

2.3、获取Class对象中的方法:

A:获取所有方法及信息,代码如下:

  1.    Class clazz = StudentDemo.class;
  2.    // 获取由public修饰的方法
  3.    Method[] methods = clazz.getMethods();
  4.    for (Method method : methods) {
  5.        System.out.println(method);
  6.    }

运行的结果如下:

B、获取当前类中所有的方法,代码如下:

  1.   methods = clazz.getDeclaredMethods();
  2.        for (Method method : methods) {
  3.            System.out.println(method);
  4.            System.out.println("方法访问修饰符:" + Modifier.toString(method.getModifiers()));
  5.            System.out.println("方法返回类型:" + method.getReturnType().getSimpleName());
  6.            System.out.println("方法名称:" + method.getName());
  7.            System.out.println("参数类型数组:" + Arrays.toString(method.getParameterTypes()));
  8.            System.out.println("参数个数:" + method.getParameterCount());
  9.            System.out.println("参数数组:" + Arrays.toString(method.getParameters()));
  10.        }

运行结果如下:

C:获取Class对象中的单个私有的方法并且赋值,代码如下:这个getUserName的访问修饰符是public的

  1.        // 创建一个Student对象
  2.        StudentDemo stu = new StudentDemo();
  3.        // 单独获取一个方法【方法名称必须和类中名完全匹配】,setAge方法是StudentDemo中私有的方法
  4.        Method method = clazz.getDeclaredMethod("setAge", int.class, String.class);
  5.        // 开启任何方法的访问权限
  6.        method.setAccessible(true);
  7.        Object object = method.invoke(stu, 10, "张三");
  8.        System.out.println(stu.getUsername());

运行的结果如下:

如果想要获取下私有的getAge方法,代码如下:

  1.        Method getMethod = clazz.getDeclaredMethod("getAge");
  2.        geMethod.setAccessible(true);
  3.        Object value1 = getMethod.invoke(stu);
  4.        System.out.println(value1);

运行的结果如下:

3、通过Class对象调用对应类的构造函数创建对象的实例

A、 获取使用public修饰的构造器,代码如下:

  1.    Class clazz = StudentDemo.class;
  2.        // 获取使用public修饰的构造器
  3.        Constructor[] constructors = clazz.getConstructors();
  4.        for (Constructor cl : constructors) {
  5.            System.out.println(cl);
  6.        }

运行的结果如下:

B:获取当前类中所有的构造器,代码如下:

  1.      constructors = clazz.getDeclaredConstructors();
  2.        for (Constructor cl : constructors) {
  3.            System.out.println(cl);
  4.            System.out.println("访问修饰符:"+Modifier.toString(cl.getModifiers()));
  5.            System.out.println("构造器名称:"+cl.getName());
  6.            System.out.println("参数类型数组:"+Arrays.toString(cl.getParameterTypes()));
  7.        }

运行的结果如下:

C、获取一个私有的构造器对象并且初始化这个对象,代码如下:

  1.       // 获取一个构造器对象
  2.        Constructor conl = clazz.getDeclaredConstructor(int.class, String.class);
  3.        // 开启任何构造函数的访问权限
  4.        conl.setAccessible(true);
  5.        // 通过参数个数和类型创建对象的实例
  6.        Object object = conl.newInstance(100, "AAA");
  7.        System.out.println(object);

运行的结果如下:

总结:上面的是反射中常用的方法。通过获取到类对象就可以为所欲为了。但是操作不了匿名内部类。

相关文章
|
24天前
|
存储 Java
[Java]反射
本文详细介绍了Java反射机制的基本概念、使用方法及其注意事项。首先解释了反射的定义和类加载过程,接着通过具体示例展示了如何使用反射获取和操作类的构造方法、方法和变量。文章还讨论了反射在类加载、内部类、父类成员访问等方面的特殊行为,并提供了通过反射跳过泛型检查的示例。最后,简要介绍了字面量和符号引用的概念。全文旨在帮助读者深入理解反射机制及其应用场景。
16 0
[Java]反射
|
2月前
|
安全 Java 索引
Java——反射&枚举
本文介绍了Java反射机制及其应用,包括获取Class对象、构造方法、成员变量和成员方法。反射允许在运行时动态操作类和对象,例如创建对象、调用方法和访问字段。文章详细解释了不同方法的使用方式及其注意事项,并展示了如何通过反射获取类的各种信息。此外,还介绍了枚举类型的特点和使用方法,包括枚举的构造方法及其在反射中的特殊处理。
62 9
Java——反射&枚举
|
1月前
|
安全 Java 测试技术
🌟Java零基础-反射:从入门到精通
【10月更文挑战第4天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
25 2
|
2月前
|
安全 Java API
【Java面试题汇总】Java基础篇——String+集合+泛型+IO+异常+反射(2023版)
String常量池、String、StringBuffer、Stringbuilder有什么区别、List与Set的区别、ArrayList和LinkedList的区别、HashMap底层原理、ConcurrentHashMap、HashMap和Hashtable的区别、泛型擦除、ABA问题、IO多路复用、BIO、NIO、O、异常处理机制、反射
【Java面试题汇总】Java基础篇——String+集合+泛型+IO+异常+反射(2023版)
|
1月前
|
IDE Java 编译器
java的反射与注解
java的反射与注解
16 0
|
2月前
|
Java 程序员 编译器
Java的反射技术reflect
Java的反射技术允许程序在运行时动态加载和操作类,基于字节码文件构建中间语言代码,进而生成机器码在JVM上执行,实现了“一次编译,到处运行”。此技术虽需更多运行时间,但广泛应用于Spring框架的持续集成、动态配置及三大特性(IOC、DI、AOP)中,支持企业级应用的迭代升级和灵活配置管理,适用于集群部署与数据同步场景。
|
2月前
|
存储 安全 Java
扫盲java基础-反射(一)
扫盲java基础-反射(一)
|
4月前
|
安全 Java 测试技术
day26:Java零基础 - 反射
【7月更文挑战第26天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
34 5
|
3月前
|
缓存 安全 Java
【Java 第十篇章】反射
Java 反射技术让程序能在运行时动态获取类信息并操作对象,极大提升了灵活性与扩展性。本文将介绍反射的基本概念、原理及应用,包括如何使用 `Class`、`Field`、`Method` 和 `Constructor` 类进行动态操作。此外,还将探讨反射在动态加载、框架开发与代码测试中的应用场景,并提醒开发者注意性能与安全方面的问题,帮助你更合理地运用这一强大工具。
29 0
|
4月前
|
IDE Java 测试技术
Java进阶之反射
【7月更文挑战第14天】Java反射机制允许在运行时动态获取类信息、创建对象及调用其方法。它基于`Class`类,让我们能访问类的属性、方法、构造器。例如,通过`Class.forName()`加载类,`Class.newInstance()`创建对象,`Method.invoke()`执行方法。反射广泛应用于动态代理、单元测试、序列化及框架中,提供灵活性但牺牲了性能,且可破坏封装性。IDE的代码补全也是反射的应用之一。在使用时需谨慎,避免对私有成员的不当访问。
39 1