反射

Class

  每一个对象运行时都有一个对应的Class对象。如果要用反射,必须先获取Class对象。

Class的获取有三种方式

 1. 已经有对象的情况,调用对象的getClass方法。

1
2
User user = new User();
Class<?> clazz = user.getClass();

 2.直接 类名.class。

1
Class<?> clazz = User.class;

 3.不知道对象的情况,只知道对象的全限名字符串。

1
2
Class.forName(String className)
Class<?> clazz = Class.forName("org.fkjava.bean.User");

Class重点掌握方法

1
2
Class<?> clazz = Class.forName("org.fkjava.bean.User"); //根据全限名获得Class对象
Object obj = clazz.newInstance();//通过Class创建实例,相当于调用无参数构造器创建实例

Field – Class的字段信息

Field没有构造器,只能通过Class获取

重点方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
getDeclaredFields():获得所有字段(私有和非私有都可以获取),返回字段数组。

getDeclaredField("字段名"):根据字段名获得字段对象(私有和非私有都可以获取)。

getFields():获得所有字段(不能获取私有字段),返回字段数组。

getField("字段名"):根据字段名获得字段对象(不能获取私有字段)

getName():获得字段名。

getType():获得字段类型。

set(Object obj, Object value):给字段赋值的方法,value表示字段要赋的值,obj表示字段的对象。

get(Object obj):从字段上取值的方法。obj表示字段的对象。

isAccessible():判断是否进行安全检查,可访问返回true,不可访问返回false

setAccessible(true):设置是否进行安全检查,值为 true 则指示反射的对象在使用时应该取消 Java 语言访问检查。值为 false 则指示反射的对象应该实施 Java 语言访问检查。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
package reflect获取class类型的常用方式;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

import javaApp.User;

public class Test {

public static void main(String[] args) throws Exception {
// 创建User对象
User user = new User();

// 获取对象的class类型
Class<?> clazz = user.getClass();

// 获取类中声明的所有的字段,不能获取私有的字段
Field[] fields = clazz.getFields();

// 根据字段名字获取字段对象
//Field field = clazz.getField("id");
//System.out.println("字段名:"+field.getName()+"type:"+field.getType()+"modifiers"+field.getModifiers());

//获取所有的字段信息
Field[] declardFields= clazz.getDeclaredFields();

// 根据字段名字获取字段对象,可以获取私有的字段
Field field2 = clazz.getDeclaredField("id");

//获取类中生命的所有的方法,不能获取私有的方法
Method[] method= clazz.getMethods();

// 根据方法名字获取方法,不能获取私有的方法
Method method2 = clazz.getMethod("getId");

//获取所有的方法,可以获取私有的方法,但方法一般都不会去私有
Method [] method3 = clazz.getDeclaredMethods();

// 根据方法名字获取方法,可以获取私有的方法
Method method4 = clazz.getDeclaredMethod("setId",int.class);

//利用反射技术调用user对象的setId()方法
method4.invoke(user, 1);

//利用反射技术调用user对象的getId()方法
method2.invoke(user);
System.out.println("id:"+method2.invoke(user));

/*
当字段是public修饰时,可以用以下方法,
私有的直接这样做会发生异常,java.lang.IllegalAccessException
可以通过field.setAccessible(true) 取消安全检查解决,这样做会破坏java的封装性
*/

//account字段是public的,
Field field3 = clazz.getField("account");

//给user对象的account属性赋值
field3.set(user,"jack");
//取值
field3.get(user);
System.out.println("account:"+field3.get(user));

}

}

Method – Class的方法

Method没有构造器,只能通过Class获取。

重点方法

1
2
3
4
5
6
7
getDeclaredMethods():获取所有方法。

getDeclaredMethod(String name, Class<?>... parameterTypes):根据方法名获取方法,name是方法名,parameterTypes是可变参数,表示方法所需要的参数。

invoke(Object obj, Object... args):调用方法,obj表示调用方法的对象,args是可变参数,表示调用该方法需要传递的参数。

getName():获得方法名。

-------------本文结束感谢您的阅读-------------