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);
}
}