天天看点

JAVA反射机制(非常重要)

文章目录

    • 1. 什么是反射?
    • 2. 反射的起源?
    • 3. 反射的作用?
    • 4. 反射常见问题?

1. 什么是反射?

反射java语言中的一种机制,通过这种机制可以动态的实例化对象、读写属性、调用方法

2. 反射的起源?

一切反射相关的代码都从获得类对象开始

//3.1 Class.forName(完整类名 或者 "类的全路径") 
  //          例:Class clz=Class.forName("com.wangyiying.Aservlet");
  //		     Aservlet a=clz.newInstance();
  
  //3.2 类名.class			     
  //         例:Student,class或者AServlet.class
  
  //3.3 对象.getClass()           
  //           例:	Student stu=new Student();
//	                Class clz=stu.getClass();
           

3. 反射的作用?

作用:

(一)实例化对象

Student stu=new Student();
	Class clz=stu.getClass();
           

(二)动态调用方法

Class clz=Student.class;
    Method m=clz.getDeclaredMethod("add",Integer.class,Integer.class);
	m.setAccessible(true);
	Object invoke = m.invoke(clz.newInstance(),20,5);
	System.out.println(invoke);
           

(三)读写属性

(1)读

Student stu=new Student("s001","zs");
		stu.age=31;
		
		Class clz=stu.getClass();
//		获取属性值
		Field[] fields = clz.getDeclaredFields();
		for (Field field : fields) {
			field.setAccessible(true);
			System.out.println(field.getName()+":"+field.get(stu));
		}



           

(二)写

Student stu=new Student("s001","zs");
		stu.age=31;
		
		Class clz=stu.getClass();
//		设置属性值(共有的)
//		Field field = clz.getDeclaredField("age");
//		field.set(stu, 45);
//		System.out.println(stu.age);
		
		Field field = clz.getDeclaredField("sname");
		field.setAccessible(true);
		field.set(stu, "ls");
		System.out.println(stu.getSname());
           

4. 反射常见问题?

(一)封装后的类,内部的属性一定不能够被外界访问吗?

不是,可以被外部访问

(二)内部私有化的方法一定不能被外界调用吗?

不是,可以被外部调用

Person p=new Person("001","zs",33);
	
	Field[] fields = p.getClass().getDeclaredFields();
	for (Field field : fields) {
		field.setAccessible(true);
		System.out.println(field.getName()+"   ,     "+field.get(p));
	}
           

(三)getConstructor 与 getDeclaredConstructor的区别?

getConstructor获取的是public修饰

getDeclaredConstructor 获取的所有的构造器

继续阅读