反射机制

在这里插入图片描述

1、反射是什么

在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性,这种动态获取的信息以及动态调用对象的方法的功能称为JAVA语言的反射机制

2、获得一个类的类对象的方式

(1)类名.class
(2)对象.getClass()
(3)Class.forName(包名.类名)

//第一种方式:类名.class
Class stuClass1 = Student.class;
		
//第二种方式:对象.getClass()
Student stu = new Student();
Class stuClass2 =  stu.getClass();
		
//第三种方式:Class.forName(包名.类名)
Class stuClass3 = Class.forName("com.xiaoxue.demo.Student");
3、通过反射创建对象

(1)类对象调用newInstance()方法
(2)通过类对象的getConstructor()或getDeclaredConstructor()方法获得构造器对象并调用newInstance()方法创建对象

//第一种方式:类对象调用newInstance()方法
Class stuClass = Class.forName("com.xiaoxue.demo.Student");
Object obj = stuClass.newInstance();

//第二种方式:
Class stuClass = Class.forName("com.xiaoxue.demo.Student");
Object obj = stuClass.getConstructor().newInstance();

等价于 Student stu = new Student();

4、通过反射设置对象私有字段的值

通过类对象的getDeclareField()方法字段对象,类对象调用方法setAccessible(true)(表示屏蔽java语言的权限访问检查),再通过set()方法设置字段的值set(Object obj, Object newValue)


Object obj = stuClass.getConstructor().newInstance();
Field f = stuClass.getDeclaredField("phoneNum");
f.setAccessible(true);
f.set(obj, "123456");
5、通过反射调用对象的方法

调用invoke()方法

Method m = stuClass.getMethod("print");
m.invoke()
package com.xiaoxue.demo;

public class Student {
	
	public Student() {
		
	}
	public String name;
	protected int age;
	char sex;
	private String phoneNum;
	
	@Override
	public String toString() {
		return "Student[name=" + name + ", age=" + age + ", sex =" + sex + ", phoneNum =" + phoneNum + "]";
	}

	public void print(){
		System.out.println("hello reflact");
	}
}
package com.xiaoxue.demo;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;

public class ReflectTest {

	public static void main(String[] args) throws NoSuchMethodException, SecurityException, ClassNotFoundException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchFieldException {
		Class stuClass = Class.forName("com.xiaoxue.demo.Student");
		System.out.println("获取所有公有的字段");
		Field[] fieldArray = stuClass.getFields();
		for(Field f : fieldArray) {
			System.out.println(f);
		}
		System.out.println("获取所有的字段(包括私有、受保护、默认)");
		fieldArray = stuClass.getDeclaredFields();
		for(Field f : fieldArray) {
			System.out.println(f);
		}
		Object obj = stuClass.getConstructor().newInstance();
		Student stu = (Student)obj;
		System.out.println("获取私有字段并调用");
		Field f = stuClass.getDeclaredField("phoneNum");
		System.out.println(f);
		f.setAccessible(true);
		f.set(obj, "123456");
		System.out.println("验证电话:" + stu);

		Method m = stuClass.getMethod("print");
		System.out.println(m.invoke(m));
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值