1 import java.lang.reflect.Constructor;
2 import java.lang.reflect.*;
3
4 /*Class:代表一个字节码文件的对象,每当有类被加载进内存,JVM就会在堆上给
5 * 该类创建一个代表该类的对象。每个类的Class对象是的。
6 *Class类没有构造方法,获得类对应的Class方法有3种
7 *1.:getClass()、2.类、接口.class 、3.Class.forName("类全名");
8 *比较推荐使用第3种方式,使用前两种方式程序扩展性不好。
9 *
10 *Class类中定义了许多关于获取类中信息的方法:
11 *1.获得该类的构造方法,属性,方法、实例的方法。包含特定情况的获得
12 *2.获得该类的父类,实现的接口,该类的类加载器,类名、包名等。
13 *3.判断该类的具体是接口、类、内部类等
14 *4.方法中加Declared表示可以获得本类定义的任何方法和属性
15 *
16 *注意:关于获得到的方法、属性、构造器的具体操作被封装在import java.lang.reflect包里面
17 *Method:里面最常用的方法invoke(对象,可变参数列表)--调用指定的方法
18 *Field:get/set;获取和修改属性值
19 *Constrcutor:使用newInstance(可变参数列表)--调用指定构造方法创建类的实例
20 *注意:私有的要调用前先去掉访问权限限制setAccssible()
21 * */
22 public class ReflectionWithClass {
23
24 public static void main(String[] args) throws Exception {
25
26 //第一种方式获得Class对象,比较麻烦,要先创建对象,再使用对象调用方法
27 HelloKitty ht = new HelloKitty();
28 Class clazz = ht.getClass();
29
30 //第二种方式获得Class对象。使用静态的属性创建
31 Class clazz1 = HelloKitty.class;
32
33 //使用Class对象的静态方法获得Class对象
34 Class clazz2 = Class.forName("HelloKitty");
35
36 //获得该类的类加载器
37 ClassLoader c = clazz2.getClassLoader();
38 System.out.println(c.toString());
39
40 Class clazz3 = String.class;
41 System.out.println(clazz3.getClassLoader());
42
43 //获得该类的实例
44 Object obj = clazz2.newInstance();
45 //获得该类的构造器---公开的,getDeclaredConstructors()--可以获得私有的
46 Constructor[] con = clazz2.getDeclaredConstructors();
47 for(Constructor cc:con){
48 System.out.print(cc + " ");
49 }
50
51 //获得类的方法
52 Method[] mm = clazz2.getDeclaredMethods();
53 for(Method mmm:mm){
54 System.out.print(mmm + " ");
55 }
56
57 System.out.println();
58 //获取特定的方法
59 Method m = clazz2.getMethod("walk",null);
60 System.out.println(m.toString());
61
62 Field[] f = clazz2.getDeclaredFields();
63 for(Field ff:f){
64 System.out.print(ff+ " ");
65 }
66
67 //调用指定的方法---先获取,在调用;注意私有方法先设置访问权限
68 Method m1 = clazz2.getMethod("walk", null);
69 System.out.println("hahahhha");
70 m1.invoke(obj,null);
71
72 //调用指定的构造方法创建类实例;先获取在调用
73 Constructor cc = clazz2.getConstructor(int.class,String.class);
74 Object o1 = cc.newInstance(12,"blue");
75
76 //获取和修改对象的属性值
77 Field ffs = clazz2.getDeclaredField("age");
78 ffs.setAccessible(true);
79 ffs.set(obj, 29);
80 Object oo = ffs.get(obj);
81 System.out.println(oo);
82
83 }
84
85 }
86
87 class HelloKitty {
88 private int age;
89 public String color = "pink";
90 public HelloKitty() {}
91
92
93 public HelloKitty(int age) {
94 this.age = age;
95 }
96
97 public HelloKitty(int age,String color) {
98 this.age = age;
99 this.color = color;
100 System.out.println("okokok");
101 }
102
103 public void walk(){
104 System.out.println("hhhhhhhhhhhhh");
105 }
106
107 public void talk(int i){
108 System.out.println(i + "----------" + age);
109 }
110 }