这里介绍Java里反射的一些基本方法使用。
创建class的三种方式
类型.class
1 | Class c1 = Person.class; |
Class.forName
1 | Class c2 = Class.forName("com.changxiao.Person"); |
对象.getClass
1 | Person p = new Person("张三", "男", 18); |
获取类名
1 | Person.class.getSimpleName(); // 获取类名:Person |
属性操作
获取Class:Class pc = Class.forName("com.changxiao.Person");
获取所有可见(非private)属性
1 | Field[] fields = pc.getFields(); |
获取所有已声明属性(已声明表示在自己类中声明的任何属性)
1 | Field[] allFields = pc.getDeclaredFields(); |
获取指定的可见的属性
1 | // name 非private |
注意:如果name是private的,则会出现java.lang.NoSuchFieldException
异常
获取指定的属性
1 | Field f2 = pc.getDeclaredField("gender"); |
注意:如果gender为private则必须要设置f2.setAccessible(true);
如果没有设置后面的属性会出现java.lang.IllegalAccessException
异常
对方法操作
获取所有可见的方法
1 | Method[] ms1 = pc.getMethods(); |
获取所有已声明的方法
1 | Method[] ms2 = pc.getDeclaredMethods(); |
获取可见的指定方法, 参数列表必须指定, 被获取方法带参数
1 | Method m1 = pc.getMethod("setGender", new Class[] { String.class }); |
获取可见的指定方法, 参数列表必须指定, 被获取方法不带参数
1 | Method m2 = pc.getMethod("getGender", new Class[] { }); |
获取已声明的指定方法
1 | pc.getDeclaredMethod(name, parameterTypes) |
对构造方法操作
1 | pc.getConstructors(); |
代码展示上述用法
反射用法
1 | // 创建class的三种方式 |
属性Field的使用
1 | Person p = new Person("张全蛋", "男", 18); |
输出:
name
张全蛋
构造方法Constructor的使用
1 | // 获取类型 |
输出:
Person [name=张三丰, gender=男, age=800]
小知识:Integer.TYPE 输出为int
查看Integer的源码:
1 | /** |
方法Method的使用
1 | Person p1 = new Person("张全蛋", "男", 18); |
输出:
male
参考资料
Enjoy It!