Java—反射

一、反射原理

通过一个路径,Java反射机制(类的加载器)自动创建一个对象

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


二、获取类的三种方式

Student类

public class Student {
	private String name;

	private Student() {
	}
	
	public Student(int age) {
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
	
	public void test(int i){
		System.out.println("test方法" + i);
	}
	
}
public class ReflectDemo {
	public static void main(String[] args) throws Exception {
		// 获取Class对象的三种方式:
		// 方式一
//		Class clazz = Student.class;
		
		// 方式二:常用
//		Class<?> clazz = Class.forName("cn.kooun.reflect.Student");
		
		// 方式三
		Student s = new Student();
		Class<? extends Student> clazz = s.getClass();
		System.out.println(clazz);
	}
}

三、通过反射获取构造器

public class ReflectDemo {
	public static void main(String[] args) throws Exception {
		Class<?> clazz = Class.forName("cn.kooun.reflect.Student");
		
		// 通过反射获取构造器
//		Constructor<?> constructor = clazz.getConstructor(int.class);
//		System.out.println(constructor);
		
//		Constructor<?>[] constructors = clazz.getConstructors();
//		for (Constructor<?> c : constructors) {
//			System.out.println(c);
//		}
		
		// 暴力获取构造器(可以获取私有的)
		Constructor<?> declaredConstructor = clazz.getDeclaredConstructor();
		// 取消 Java 语言访问检查,绕过修饰权限
		declaredConstructor.setAccessible(true);
		System.out.println(declaredConstructor);
	}
}

四、通过反射创建对象和调用方法

public class ReflectDemo {
	public static void main(String[] args) throws Exception {
		Class<?> clazz = Class.forName("cn.kooun.reflect.Student");
		
		// 暴力获取构造器(可以获取私有的)
		Constructor<?> declaredConstructor = clazz.getDeclaredConstructor();
		// 取消 Java 语言访问检查,绕过修饰权限
		declaredConstructor.setAccessible(true);
		System.out.println(declaredConstructor);

		// 创建实例
		Object newInstance = declaredConstructor.newInstance();
		// 通过反射获取方法
		Method method = clazz.getMethod("test", int.class);
		method.invoke(newInstance, 10);
	}
}

五、通过反射获取成员变量

public class ReflectDemo01 {
	public static void main(String[] args) throws Exception {
		Class<?> clazz = Class.forName("cn.kooun.reflect.Student");

		// 暴力获取构造器(可以获取私有的)
		Constructor<?> declaredConstructor = clazz.getDeclaredConstructor();
		// 取消 Java 语言访问检查,绕过修饰权限
		declaredConstructor.setAccessible(true);
		System.out.println(declaredConstructor);
		
		Object newInstance = declaredConstructor.newInstance();
		
		// 通过反射获取成员变量
		Field field = clazz.getDeclaredField("name");
		field.setAccessible(true);
		field.set(newInstance, "Sunny");
		System.out.println(field.get(newInstance));
	}
}
posted @ 2020-11-16 16:08  娜豆  阅读(105)  评论(0编辑  收藏  举报