![image-20181209133251466](../../../../Users/apple/Library/Application Support/typora-user-images/image-20181209133251466.png)

java反射机制完全详解

#1.反射源头 —Class类

1.1 取得Class类对象 ⭐️

1
2
3
4
5
6
7
public class Demo {
public static void main(String[] args) {
Date date = new Date();
Class<? extends Date> class1 = date.getClass();//取得class类对象
System.out.println(class1);//class java.util.Date
}
}
1
2
3
4
5
6
7
8
//利用类.class获得反射的是实例划对象
public class Demo1 {
public static void main(String[] args) {
Date date = new Date();
Class<? extends Date> class1 = java.util.Date.class ;//取得class类对象
System.out.println(class1);//class java.util.Date
}
}
1
2
3
4
5
6
7
8
//利用Class类提供的方法实例化对向
public class Demo2 {
public static void main(String[] args) throws ClassNotFoundException {
Class<?> forName = Class.forName("java.util.Date");
System.out.println(forName);//class java.util.Date
}

}

image-20181209065531027

image-20181209065552031

image-20181209065610108

#2.利用反射实例化对象

2.1public T newInstacne ⭐️⭐️

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class Demo3 {
public Demo3() {
System.out.println("^^^^");
}
public String toString() {
return "######";
}
}
--------------------------------------------------------------------------------
public class Demo4 {
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
Class<?> class1 = Class.forName("反射.Demo3");
Object object = class1.newInstance();// 实例化对象
// Demo3 demo3=new Demo3();//调用无参构造
System.out.println(class1);
System.out.println(object);
}
}

image-20181209071201967


2.2。工厂设计模式


3.取得类继承结构

image-20181209072002912

image-20181209072038753


image-20181209072101490

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

public class Demo3 extends Object implements Serializable {
public Demo3() {
System.out.println("^^^^");
}

public String toString() {
return "######";
}
}
--------------------------------------------------------------------------------


public class Demo4 {
public static void main(String[] args)
throws ClassNotFoundException, InstantiationException, IllegalAccessException {
Class<?> class1 = Class.forName("反射.Demo3");
class1.getName();// 包名.类名
class1.getPackage();// package 包名
class1.getPackage().getName();// 包名
class1.getSimpleName();// 类名

class1.getSuperclass().getName();// 父类的包名
Class<?>[] icls = class1.getInterfaces();// [Ljava.lang.Class;@6bf256fa
for (int i = 0; i < icls.length; i++) {
System.out.println(icls[i].getSimpleName());//Serializable
}

image-20181209073242823

image-20181209073335835

4.反射取得构造方法(invoke)

image-20181209091731678

image-20181209091744030


image-20181209091924296

image-20181209092434006

5.反射取得方法 ⭐️⭐️⭐️

image-20181209092707626


image-20181209092730947

image-20181209092742987

image-20181209092955657


image-20181209093048728


1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Demo5 {

public static void main(String[] args) throws ClassNotFoundException {
getMethodDemo();
}
// 获取指定Class中的公共函数
public static void getMethodDemo() throws ClassNotFoundException {
Class<?> clazz = Class.forName("反射.Persion");
Method[] methods = clazz.getMethods();
for (int i = 0; i < methods.length; i++) {
System.out.println(methods[i]);
}

}

image-20181209094546727


6.Invoke

image-20181209094620520

image-20181209095804423

image-20181209100015073