Java反射
Java反射机制是运行状态中,对于任意一个类都能够知道这个类的所有属性和方法(包括私有的);对于任意一个对象,都能够调用他的任意方法和属性;这种动态动态获取信息及动态调用对象方法的功能称为功能称为Java的反射机制。
1.用途
①在运行时判断任一对象所属的类。
②在运行时构造任意一个类的对象。
③在一个类运行时判断任意一个类所具有的的成员变量和方法。
④在运行时调用任意一个对象的方法。
java反射的目的:高内聚,低耦合
java反射实现了不用知道类就能实例化,不用硬编程
归根结底反射的作用:通过反射访问java的属性、方法、构造方法等。

可以这样理解,类是用来抽象的描述了对象的属性、方法、构造方法,而反射就是把类当做一个集合,抽象的描述类的特征。


2.得到class类的对象的三种方式

package reflect;

public class Student {

	private String name;
	private  int age;
	public int money;
	public Student(String name) {
		this.name =name;
	}
	public void getage(int age) {
		this.age = age;
	}
}
package reflect;

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

public class Test {

	public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, SecurityException, NoSuchMethodException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
		// TODO 自动生成的方法存根

	  //1.第一种方式,通过类的静态方法——forName()来实现(注意Name的首字母)
	  Class<?> class1 = Class.forName("reflect.Student");
	  //2.通过类的class属性来获得Class对象
	  Class<Student> class2 = Student.class;
	  //3.通过对象.getClass()方法来获得
	  Student student  = new Student();
	  Class<?>class3 = student.getClass();
	  //***********************************************************************************
	  //Field类(属性)
	  
	  //获取class对象的所有属性
	  Field[] allField =class1.getDeclaredFields();
	  
	  //获取class对象的所有公有属性
	  Field[] publicField = class1.getFields();
	  
	  //获取class对象指定的属性,可以是私有属性
	  Field nameField = class1.getDeclaredField("name");
	  Field monField = class1.getField("money");
	  
	  //************************************************************************************
	  //Method类(方法)
	  //获取class对象所有声明的方法
	  Method[] methods = class1.getDeclaredMethods();
	  
	  //获取class类的所有的public方法包括父类的方法
	  Method[] allMethods = class1.getMethods();
	  
	  //返回class对象对应类的带指定形参列表的方法
	  Method method = class1.getMethod("age", int.class);
	  
	  //****************************************************************************************
	  //Constructor(构造方法)
	  //获取class对象所有声明的构造函数
	  Constructor<?>[] allConstructors = class1.getDeclaredConstructors();
	  
	  //获取class对象的public构造函数
	  Constructor<?>[] publicConstructors = class1.getConstructors();
	  
	  //获取指定声明的构造函数
	  Constructor<?> constructor = class1.getDeclaredConstructor(String.class);
	  
	  //获取指定的public 构造函数
	  Constructor publicconstructor = class1.getConstructor(String.class);
	  
	  
	  //*****************************************************************************************
	  //生成实例对象
	  //方式1。通过class对象直接调用newInstance方法,获得实例对象
	  //使用方法1,要求Class对象有默认的构造器,而执行newINstance就是在执行其默认的构造器方法
	  Object object = class1.newInstance();
	  
	  //方式2.通过先得到class对象获取到指定的构造函数
	  Constructor<?> constructor2 = class1.getDeclaredConstructor(String.class);
	  Object obj = constructor2.newInstance("XiaoBai");
	  
	  //*********************************************************************************************
	  //调用方法()
	  //方式1.通过Class对象的额getMethods()方法或者getMethod()方法得到指定的方法,返回Method数组或者对象
	   //在调用方法之前要先生成新的对象
	  //  Object object = class1.newInstance();
	  //需要先获得和该方法对应的Method对象
	  Method method2 = class1.getDeclaredMethod("getage", int.class);
	  //调用指定的函数并传递参数
	  method2.invoke(obj, 18);
 
	  
	}

}