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 }
Test.java

相关文章: