1 package com.part1; 2 3 import java.lang.reflect.Constructor; 4 import java.lang.reflect.Field; 5 import java.lang.reflect.InvocationTargetException; 6 import java.lang.reflect.Method; 7 8 public class Test1 { 9 public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, SecurityException, NoSuchMethodException, IllegalArgumentException, InvocationTargetException, NoSuchFieldException { 10 //1.获取Class对象三种方式 11 //1.1 getClass方法反射只能获取类信息(比较烦) 12 Student stu=new Student(); 13 Class cla=stu.getClass(); 14 System.out.println(cla); 15 16 //1.2 class方法反射获取类或接口信息 (更方便) 17 Class cla2=Student.class; 18 System.out.println(cla2); 19 20 //1.3 forName方法根据地址反射获取类或接口信息(更精确) 21 Class cla3=Class.forName("com.part1.Student"); 22 System.out.println(cla3); 23 24 //2.动态创建对象 25 //2.1 newInstance创建对象(无参数) 26 Student stu2=(Student) cla2.newInstance(); 27 System.out.println(stu2); 28 29 //2.2通过有参数构造创建对象 30 //获取有参数的构造方法 31 Constructor con=cla3.getConstructor(int.class,String.class,int.class); 32 33 //根据有参数的构造方法创建对象 34 Student stu3=(Student) con.newInstance(1,"holly",18); 35 System.out.println(stu3); 36 37 //3.获取对象的属性 38 //3.1 获取public字段 39 System.out.println("-----------------获取public字段----------------"); 40 //3.1.1 只能获取所有公用的属性 41 Field[] stuFields=cla2.getFields(); 42 for (Field i : stuFields) { 43 System.out.println(i); 44 } 45 //3.1.2 获取某一个公共的属性 46 Field sexField=cla2.getField("sex"); 47 48 //3.1.3 给某个公共属性赋值 49 sexField.set(stu2, "女"); 50 51 //3.1.4 获取某个公共属性值 52 System.out.println(sexField.get(stu2)); 53 54 //3.2获取私有的字段 55 System.out.println("-----------获取字段和访问修饰符无关----------"); 56 //3.2.1 获取所有字段和访问修饰符无关 57 Field[] fields3=cla3.getDeclaredFields(); 58 for (Field field : fields3) { 59 System.out.println(field); 60 } 61 62 //3.2.2 获取某个私有字段 63 Field snameField=cla3.getDeclaredField("sname"); 64 65 //3.2.3 给某个私有字段解除权限,参数为true截取权限限制 66 snameField.setAccessible(true); 67 68 //3.2.4 给解除的私有字段赋值 69 snameField.set(stu3, "王静娴"); 70 71 //3.2.5 获取某个字段的属性值 72 System.out.println(snameField.get(stu3)); 73 74 //4.获取对象的方法 75 System.out.println("----获取所有的公共方法----"); 76 //4.1 获取公有方法 77 //4.1.1 获取所有的公共的方法 78 Method[] methods =cla2.getMethods(); 79 for (Method method : methods) { 80 System.out.println(method); 81 } 82 83 //4.1.2 获取某个公共的方法 84 Method passwordMethod=cla2.getMethod("setPassword", int.class); 85 86 //4.1.3 动态调用方法 87 passwordMethod.invoke(stu2, 123); 88 System.out.println(stu2); 89 90 //4.2 获取方法(和访问修饰符无关) 91 //4.2.1 获取所有的方法和访问修饰符无关 92 Method[] methods2=cla3.getDeclaredMethods(); 93 for (Method method : methods2) { 94 System.out.println(method); 95 } 96 97 //4.2.2 获取某个私有方法,获取的方法签名 98 Method eatMethod=cla3.getDeclaredMethod("eat", String.class); 99 100 //4.2.3 解除方法操作权限 101 eatMethod.setAccessible(true); 102 103 //4.2.4 调用某个方法 104 eatMethod.invoke(stu3, "中午吃木桶饭"); 105 106 107 } 108 109 }
相关文章: