java基础--反射

什么是反射:

java通常是先有类再有对象,有对象我就可以调用方法或者属性。反射其实是通过Class对象来调用类里面的方法。通过反射可以调用私有方法和私有属性。大部分框架都是运用反射原理。

反射的作用:

动态的加载类和类中的信息

反射小例子:

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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
@SuppressWarnings("all")
public class ReflexTestDemo {

public static void main(String[] args){
String path = "com.tfs.test.User";
User user = new User();
try {
//一、获取对象的方式
Class<User> cl1 = (Class<User>) Class.forName(path);
Class cl2 = User.class;
Class cl3 = user.getClass();
System.out.println(cl1.hashCode() == cl2.hashCode()); //true
System.out.println(cl1.hashCode() == cl3.hashCode()); //true


//二、获取并使用对象内置信息

//1.获取名称
System.out.println(cl1.getName()); //com.tfs.test.User
System.out.println(cl1.getSimpleName()); //User

//2.获取并使用属性
Field[] fields = cl1.getFields(); //只能获取public的
Field[] fields1 = cl1.getDeclaredFields(); //获取全部的
Field field = cl1.getDeclaredField("name"); //根据名字获取

User u2 = cl1.newInstance(); //利用反射获取默认构造方法
field.setAccessible(true); //设置后可以不用进行安全检测,提高性能
field.set(u2,"kid"); //给name属性赋值kid
System.out.println(field.get(u2)); //输出:kid

//3.获取并使用普通方法
Method method = cl1.getDeclaredMethod("setName", String.class); //参数:方法名,方法参数

User u3 = cl1.newInstance();
method.invoke(u3,"kid"); //等同于 u3.setName("kid"); 方法
System.out.println(u3.getName()); //输出:kid

//4.获取并使用构造方法
Constructor constructor1 = cl1.getDeclaredConstructor(); //获取无参构造方法
Constructor constructor2 = cl1.getDeclaredConstructor(int.class,String.class); //获取有参构造方法

User u4 = (User) constructor2.newInstance(1008,"kid"); //调用该方法并传参
System.out.println(u4.getName()); //输出:null 所以该方法只是调用了有参的构造函数,并未真正的传参

} catch (Exception e) {
e.printStackTrace();
}
}
}

/**
* @Description:被调用的User类
* @Author:kid
* @Date: 2018/3/26 16:17
* @ISDELETE: NO
*/
public class User {
public int id;
String name;

public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public User(){

}

public User(int id,String name){

}

反射性能

反射的会影响运行的速度,但是在开发中,有一些地方还是会需要反射。那么如何解决这个问题呢?
经测验:在同时循环执行一个方法的时候,反射会比普通的方法慢很多。如将setAccessible设置为true,减少安全检测,将提升4倍的效率。