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 }