切换主题
二十一、反射
一、什么是反射
反射允许成员变量,成员方法和构造方法的信息进行编程访问

二、获取class对象
- Class.forName("全类名");
- 类名.class
- 对象.getClass();
1、Class.forName()
格式
java
Class clazz1 = Class.forName("a10.a5.Server");
2、类名.class
格式
java
Class clazz2 = Server.class;
3、对象.getClass();
格式
java
Server server=new Server();
Class clazz3 = server.getClass();
三、获取构造方法
方法名称 | 说明 |
---|---|
Constructor<?>[] getConstructors() | 返回所有公共 构造方法对象的数组 |
Constructor<?>[] getDeclaredConstructors() | 返回所有 (包含公共的和私有的)构造方法对象的数据 |
Constructor<?>[] getConstructor(Class<?>...parameterTypes) | 返回单个公共 构造方法对象 |
Constructor<?>[] getDeclaredConstructor(Class<?>...parameterTypes) | 返回所有 (包含公共的和私有的)单个构造方法对象 |
例
java
Constructor con1 = clazz.getDeclaredConstructor(int.class);
Constructor con2 = clazz.getDeclaredConstructor(String.class , int.class);
1、获取权限修饰符等级
java
int modifiers = con.getModifiers();
2、获取方法参数
java
Parameter[] parameters = con.getParameters();
for(Parameter parameter : parameter){
// parameter :参数
}
3、创建对象
java
Student stu = (Student) con.newInstance("张三",23);
私有的构造方法需加上con.setAccessible(true)
java
//临时取消权限校验
con.setAccessible(true)
Student stu = (Student) con.newInstance("张三",23);
四、获取成员变量
方法名称 | 说明 |
---|---|
Field[] getFields() | 返回所有公共 成员变量对象的数组 |
Field[] getDeclareFields() | 返回所有 (包含公共的和私有的)公共成员变量对象的数组 |
Field[] getField(String name) | 返回单个公共 成员变量对象 |
Field[] getDeclareField(String name) | 返回单个 (包含公共的和私有的)成员变量对象 |
1、获取权限修饰符等级
java
Field name =clazz.getDeclaredField("name");
int modifiers = name.getModifiers();
2、获取变量名
java
Field name =clazz.getDeclaredField("name");
String n =name.getName();
3、获取数据类型
java
Field name =clazz.getDeclaredField("name");
Class<?> type = name.getType();
4、获取成员变量记录的值
java
Student s = new Student("张三",23);
name.setAccessible(true); //如果是私有变量,临时取消权限校验
String value = (String) name.get(s);
5、修改成员变量记录的值
java
Student s = new Student("张三",23);
name.setAccessible(true); //如果是私有变量,临时取消权限校验
//修改
name.set(s,"hdq");
String value = (String) name.get(s);
System.out.println(s);
五、获取成员方法
方法名称 | 说明 |
---|---|
Method[] getMethods() | 返回所有公共 成员方法对象的数组,包括继承的 |
Method[] getDeclaredMethods() | 返回所有 成员方法对象的数组,不包括继承的 |
Method[] getMethod(String name , Class<?> ...parameterTypes) | 返回单个公共 成员方法对象 |
Method[] getDeclaredMethod(String name , Class<?> ...parameterTypes) | 返回单个 成员方法对象 |
1、获取权限修饰符等级
java
Method m = clazz2.getDeclaredMethod("eat",String.class);
int modifiers = m.getModifiers();
2、获取方法名
java
Method m = clazz2.getDeclaredMethod("eat",String.class);
String n =m.getName();
3、获取方法形参
java
Method m = clazz2.getDeclaredMethod("eat",String.class);
Parameter[] parameters = m.getParameters();
for(Parameter parameter : parameter){
// parameter :参数
}
4、获取方法抛出的异常
java
Class[] exceptionTypes = m.getExceptionTypes();
for (Class exceptionType : exceptionTypes) {
//exceptionType:异常
}
5、调用方法
java
//class对象
Class stuClass = Class.forName("a10.a5.Student");
//获取指定的成员方法
Method m = stuClass.getDeclaredMethod("eat",String.class);
//创建对象实例
Student s = new Student();
//如果是私有方法,临时取消权限校验
m.setAccessible(true);
//调用成员方法
String str = (String) m.invoke(s,"热干面");