反射
来源:互联网 发布:win10如何安装linux 编辑:程序博客网 时间:2024/05/05 19:27
反射
类字节码文件是在硬盘上存储的,是一个个的.class文件。我们在new一个对象时,JVM会先把字节码文件的信息读出来放到内存中,第二次用时,就不用在加载了,而是直接使用之前缓存的这个字节码信息。
字节码的信息包括:类名、声明的方法、声明的字段等信息。在Java中这些信息当然也需要封装成一个对象,这就是Class类、Method类、Field类。
通过Class类、Method类、Field类可以得到这个类的一些信息,甚至可以不用new关键字就创建一个实例对象,可以执行一个对象中的方法,设置或获取字段的值,这就是反射技术。
Class类
class类用于代表字节码文件对象。
获取Class对象
- forName()。forName方法用于加载某个类的字节码到内存中,并使用class对象进行封装
代码如下:
Class clazz1=Class.forName("cn.lingadobe.test.Person");
- 类名.class
Class clazz2=Person.class();
- 对象.getClass();
Person p=new Person("张三");Class clazz3=p.getClass();
通常来说,第1种方法是最为常用的。
通过Class类获取类型的一些基本信息
- getName()
类的名称(全名,全限定名) - getSimpleName()
类的的简单名称(不带包名) - getModifiers();
类的修饰符 - 创建对象
无参数构造创建对象
newInstance() - 获取指定参数的构造器对象,并可以使用Constructor对象创建一个实例
Constructor getConstructor(Class
private static void test2() throws Exception { Class clazz1 = Class.forName("cn.lingadobe.test.Person"); // 获取类的名称 String name = clazz1.getName(); System.out.println(name); // cn.itcast.gz.reflect.Person // 获取类的简单名称 System.out.println(clazz1.getSimpleName()); // Person // 获取类的修饰符 int modifiers = clazz1.getModifiers(); System.out.println(modifiers); // 构建对象(默认调用无参数构造.) Object ins = clazz1.newInstance(); Person p = (Person) ins; System.out.println(p); // 获取指定参数的构造函数 Constructor con = clazz1.getConstructor(String.class, int.class); // 使用Constructor创建对象. Object p1 = con.newInstance("jack", 28); System.out.println(((Person) p1).getName()); }
通过Class类获取类型中的方法信息(Method)
- 获取公共方法包括继承的父类的方法
getMethods()返回一个数组,元素类型是Method - 获取指定参数的公共方法
getMethod(“setName”, String.class);
其中第一个参数:就是想要获取的方法名称
第二个参数:是想要获取的方法的参数列表,可以有多个 - 获得所有的方法,包括私有
Method[] getDeclaredMethods() - 获得指定参数的方法,包括私有
Method getDeclaredMethod(String name, Class
通过Class类获取类型中的字段信息(field)
- 获取公共字段
Field[] getFields() - 获取指定参数的公共字段
Field getField(String name) - 获取所有的字段,包括私有
Field[] getDeclaredFields() - 获取指定参数的字段,包括私用
Field getDeclaredField(String name)
灵活运用Class,Method,Field这三个类的方法
0 0
- 反射
- 反射
- 反射
- 反射
- 反射
- 反射
- 反射
- 反射
- 反射
- 反射
- 反射
- 反射
- 反射
- 反射
- 反射
- 反射
- 反射
- 反射
- java输入多组字符串求解给定字符串的前缀
- 使用SSMA将MySQL数据库迁移到SQL Server
- hive-hwi 浏览器界面使用
- js中不同js文件对象、属性、方法互相调用
- [51nod 1361]有一种递推
- 反射
- 会场时间安排
- noip2016 愤怒的小鸟 状压搜索
- open与fopen的区别
- 【codeforces 550B】Preparing Olympiad
- 码率控制简单介绍
- Search in Rotated Sorted Array
- 【备忘】史上最全C++之12套开发视频教程下载
- 4.2