反射
1.获取类对象
说明:User继承了Person
User user=new User();
//1.通过对象获取,getClass()
Class c1=user.getClass();
System.out.println(c1);
//2.通过Class.forName(会抛出一个异常)
Class c2=Class.forName("reflection.User");
System.out.println(c2);
//3.通过类名获取
Class c3=User.class;
System.out.println(c3);
//4.基本类型可以通过TYPE获取
Class c4 = Character.TYPE;
System.out.println(c4);
//5.获取父类类型
Class c5 = c1.getSuperclass();
System.out.println(c5);
运行结果
2.通过反射获取类的信息
//获得类名
c1.getName();
c1.getSimpleName();
//获得属性
Field []fields=c1.getFields();//获得当前类以及超类的public Field
Field[] declaredFields = c1.getDeclaredFields();//获得当前类申明的所有Field
//Field name = c1.getField("name");//获取当前类以及超类指定public属性
//Field name1 = c1.getDeclaredField("name");//获取当前类申明的指定属性
for (Field field : fields) {
System.out.println("public属性:"+field);
}
System.out.println("======================");
for (Field declaredField : declaredFields) {
System.out.println("所有属性:"+declaredField);
}
System.out.println("======================");
//获得方法
Method[] methods = c1.getMethods();//获得当前类以及超类的public Method
Method[] declaredMethod = c1.getDeclaredMethods();//获得当前类申明的所有Method
//Method setName = c1.getMethod("setName", String.class);//获得当前类以及超类的指定的public Method
//Field siyou = c1.getDeclaredField("siyou");//获得当前类申明的指定Method
for (Method method : methods) {
System.out.println("所有的public方法:"+method);
}
System.out.println("======================");
for (Method method : declaredMethod) {
System.out.println("所有方法:"+method);
}
运行截图
3.综合
//通过Class对象实例化一个User对象
User user1 = (User) c1.newInstance();
//通过构造器构造一个User对象
Constructor constructor = c1.getConstructor();
User user2 = (User) constructor.newInstance();
//若构造器有参数则(该构造器含有一个int属性的参数)
//Constructor constructor = c1.getConstructor(int.class);
//通过反射调用方法
Method setName = c1.getDeclaredMethod("setName", String.class);
setName.invoke(user1,"lky");//使用invoke()方法其中传递的第一个参数的为需要调用方法的对象,之后的参数都是调用的方法需要的参数
System.out.println(user1.getName());
//通过反射改变属性
Field name = c1.getDeclaredField("name");
name.setAccessible(true);//setAccessible()用于关闭安全监测
// setAccessible()方法不管是属性对象还是方法对象都有,
// 将其中的值设置为true就可以操作私有的方法或者属性
name.set(user1,"lky2");//用set()方法改变属性
System.out.println(user1.getName());
运行截图