Java反射API有几类?
package | 用来描述类所属的包 |
---|
Class | 用来描述类本身 |
Field | 用来描述类中的属性 |
Method | 用来描述类中的方法 |
Constructor | 用来描述类中的构造方法 |
Annotation | 用来描述类中的注解 |
Class
# 1. Class clazz = Class.forName(“包名.类名”);
Class clz = Class.forName("java.lang.String");
# 2. Class clazz = 类名.class;
Class clz = String.class;
# 3. 对象.getClass(); (Object类中的方法)
Class clz = "str".getClass();
# 4. 基本类型的包装类的Type属性
Class<?> obj = Byte.TYPE;
obj = Short.TYPE;
obj = Integer.TYPE;
obj = Long.TYPE;
obj = Float.TYPE;
obj = Double.TYPE;
obj = Boolean.TYPE;
obj = boolean.class;
obj = Character.TYPE;
# obj.getCanonicalName()执行结果如下:
byte
short
int
long
float
double
boolean
boolean
char
基础
Package p = clazz.getPackage(); 获取所在的包
String name = p.getName()); 获取包名
String name = clazz.getName(); 获取包名+类名
String simpleName = clazz.getSimpleName(); 获取类名
Class<?> superclass = clazz.getSuperclass(); 获取父类
Class<?>[] classes = concreteClass.getClasses(); 公共内部类(包含父类)
Class<?>[] classes = concreteClass.getDeclaredClasses(); 所有内部类(不包含父类)
innerClass.getDeclaringClass().getEnclosingClass() 获取内部类的外部类,对匿名内部类也有效
Class[] classes = clazz1.getInterfaces(); 获取所有接口
int midifiers = clazz.getModifiers(); 获取类修饰符(包含权限+特征)
Modifier.toString(concreteClass.getModifiers()) 显示修饰符
构造方法
Constructor con = clazz.getConstructor(); 获取无参数构造方法
Constructor con = clazz.getConstructor(String.class); 获取有参数构造方法
Constructor[] cons = clazz.getConstructors(); 获取所有的构造方法
Constructor conabstract = clazz.getDeclaredConstructor();
Constructor conabstract = clazz.getDeclaredConstructor(String.class);
Constructor[] conabstracts = clazz.getDeclaredConstructors();
int i = con.getModifiers();
String name = con.getName();
Class[] mpts = con.getParameterTypes();
Class[] mets = con.getExceptionTypes();
Person penson = (Person)clazz.newInstance(); 相当于调用Person类默认无参数构造方法创建对象
Person penson = (Person)con1.newInstance("娃哈哈"); 由构造方法反射创建对象
参考 getDeclaringClass,getEnclosingClass
参考 getEnclosing*、getDeclared*与getDeclaringClass 区别
Field
Field field = clazz.getField("name") 获取公有属性(包含父类)
Field[] fields = clazz.getFields();
Field field = clazz.getDeclaredField("name"); 获取公有 && 私有属性(仅限本类)
Field[] fields = clazz.getDeclaredFields();
int modifiers = field.getModifiers() 获取属性的修饰符
Class fclass = field.getType() 获取属性的类型
String fname = field.getName() 获取属性的名字
Person person = (Person) clazz.newInstance(); 创造对象
field.setAccessible(true); 私有的不许操作,可以设置方法的使用权
field.set(person, "小明"); 给属性赋值
String value = (String)field.get(person); 获取属性值
Method
Method m = clazz.getMethod("eat"); 获取无参数的公有方法(包含父类)
Method m = clazz.getMethod("eat",String.class); 获取一个String类型参数的公有方法(包含父类)
Method[] ms = clazz.getMethods(); 获取所有公有的方法(包含父类)
Method m = clazz.getDeclaredMethod("drink"); 获取公有 && 私有方法(仅限本类)
Method m = clazz.getDeclaredMethod("drink", String.class); 获取一个有String类型参数的私有方法(自己类)
Method[] ms = clazz.getDeclaredMethods(); 获取全部的私有方法(自己类)
int mm = m.getModifiers(); 获取修饰符:权限+特征
Class mr = m.getReturnType(); 获取返回值数据类型的
String mn = m.getName(); 获取方法的名字
Class[] mpts = m.getParameterTypes(); 获取方法参数列表的类型
Class[] mets = m.getExceptionTypes(); 获取方法抛出异常的类型
m.setAccessible(true); 私有的不许操作,可以设置方法的使用权
m.invoke(person); 执行无参数方法
String s = (String)m.invoke(person ,"娃哈哈"); 执行有参数的方法
修饰符
0 | 默认不写 |
---|
1 | public |
2 | private |
4 | protected |
8 | static |
16 | Modifiers |
32 | synchronized |
64 | volatile |
128 | transient |
256 | native |
512 | interface |
1024 | abstract |