反射基础 reflect

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/fhm6100411074/article/details/79777130

JAVA反射机制:

1、指的是可以于运行时加载、探知、使用编译时完全未知的类

2、程序在运行状态中,可以动态加载一个只有名称的类,对于任意一个已加载的类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机

3、一个类被加载后,JVM会创建一个对应该类的Class对象,类的整个结构信息会放在对应的Class对象中,这个Class对象就像一面镜子,通过这面镜子我们就可以看到类的全部信息

一、Class类对象的三种生成方式:

1、Student student= new Student();

     Class class1 = student.getClass();

2、Class class2 = Student.class;

3、Class class3 = Class.forName("包名.类名");

在运行期间,一个类,只有一个Class对象产生。

三种方式常用第三种,第一种对象都有了还要反射干什么。第二种需要导入类的包依赖太强,不导包就抛编译错误。一般都第三种,一个字符串可以传入也可写在配置文件中。

二、例子

package com.sh.fhm.MavenTest.reflect;

public class Student {

	private String name = "周杰伦";
	private Integer age = 28;

	public Student() {}

	public Student(String name, Integer age) {
		this.name = name;
		this.age = age;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Integer getAge() {
		return age;
	}

	public void setAge(Integer age) {
		this.age = age;
	}

	@Override
	public String toString() {
		return "bean [name=" + name + ", age=" + age + "]";
	}
}

测试类:

package com.sh.fhm.MavenTest.reflect;

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;

public class ReflectTest {
	public static void main(String[] args) throws Exception {
		Class<?> clz = Class.forName("com.sh.fhm.MavenTest.reflect.Student");
		/*
		 * 两种方式调用无参的构造方法
		 */
		Student student = (Student) clz.newInstance();
		System.out.println(student.toString());

		Constructor<?> constructor1 = clz.getConstructor();
		student = (Student) constructor1.newInstance();
		System.out.println(student.toString());
		/*
		 * public Constructor<T> getConstructor(Class<?>... parameterTypes(构造方法的参数类型)) 
		 * public T newInstance(Object ... initargs(构造方法的参数值)) 
		 * 调用带参数的构造方法
		 */
		Constructor<?> constructor = clz.getConstructor(String.class, Integer.class);
		student = (Student) constructor.newInstance("张三", 23);
		System.out.println(student.toString());

		/*
		 * public Method getMethod(String name(方法名), Class<?>... parameterTypes(方法的参数类型))
		 * public Object invoke(Object obj(类的实例), Object... args(方法的参数值))
		 */
		Method method = clz.getMethod("setName", String.class);
		method.invoke(student, "李四");
		method = clz.getMethod("getName");
		System.out.println(method.invoke(student));
	}
}

猜你喜欢

转载自blog.csdn.net/fhm6100411074/article/details/79777130