1.什么是反射?
Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意方法。简单来说,根据指定的类名或对象倒推类的信息。
2.为什么要用反射?
往往我们面对一个新的知识时会疑惑为什么要用它,它存在的意义是什么,比其他的知识强在哪里…
首先我们需要知道两个概念:静态编译和动态编译。
- 静态编译:在编译时确定类型,绑定对象。
- 动态编译:运行时确定类型,绑定对象。
反射就是运用了动态编译创建对象,有很大的灵活性…
3.怎么用?
反射的核心处理在于Object的方法:
public final native Class<?> getClass();
//取得类的Class对象
class对象的三种实例化方式
1.任何类的对象可以通过调用Object类提供的getClass()方法取得该类Class对象;
Date date = new Date();//通过类正向产生对象
System.out.println(date.getClass());
//结果为class java.util.Date
2.“类名称.class”直接根据某个具体类来取得其Class对象;
Date date = new Date();
System.out.println(date.getClass() == Date.class); //结果为true
3.调用Class类的静态方法Class.forName(String className)传入类的全名称来取得其Class对象;
Class<Date> cls = (Class<Date>) Class.forName("java.util.Date");
Date date = cls.newInstance();
System.out.println(date);//打印出当前时间
反射与类操作
- 通过反射取得父类、父接口信息
I. 取得类的包名称
public Package getPackage();
II. 取得父类的Class对象
public native Class<? super T> getSuperClass();
*: ? >= T, ?是T的父类
III. 取得实现的父接口
public Class<?>[] getInterfaces();
*:返回值为数组,原因是接口多继承,而父类是单继承
- 反射调用类中构造方法
-----------------Constructor类(描述类中构造方法)
I.取得类中指定参数类型的构造
public Constructor<T> getConstructor(Class<?>... parameterTypes)
//只能取得类中public权限的构造方法
public Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)
//可以取得类中全部构造方法,包含私有构造(同下II)
II.取得类中所有构造方法
public Constructor<?>[] getConstructors() throws SecurityException
public Constructor<?>[] getDeclaredConstructors() throws SecurityException
constructor类提供了实例化对象的方法:
public T newInstance(Object ... initargs):可以调用类中其他有参构造
- 反射调用类中普通方法
---------------Method(描述类中普通方法)
I.取得类中指定名称的普通方法
public Method getMethod(String name,Class<?>... parameterTypes)
public Method getDeclaredMethod(String name,Class<?>... parameterTypes)
II.取得类中全部普通方法
public Method getMethods() throws SecurityException
//取得本类以及父类中所有public方法
public Method getDeclaredMethods() throws SecurityException
//取得本类中全部普通方法,包含私有方法
Method类中提供有调用类中普通方法的API
public Object invoke(Object obj,Object... args)
- 反射调用类中属性
取得类中全部属性
public Field[] getFields() throws SecurityException
//父类中
public Field[] getDeclaredFields() throws SecuirityException
//本类中
取得类中指定名称属性
public Field getField(String name)
throws NosSuchFieldExcepton,SecurityException
public Method getDeclaredMethod(String name,Class<?>... parameterTypes)
throws NoSuchMethodException,SecurityException
设置属性:
public void set(Object obj, Object value)
取得属性:
public Object get(Object obj)
取得属性的类型:
public Class<?> getType()
后续…敬请期待…