1.反射
1.1 什么是反射:反射是对象的反向处理,即根据对象倒推类的组成。
1.2 反射的核心处理在于处理object方法:通过调用getClass()获取类的class对象
1.3 class对象的三种实例化方式:
任何一个类的class对象由JVM加载后产生。在同一个类加载器中,class类实例化出来的对象有且仅有一个;用户只能调用指定方法来调取该对象
1).任何类的对象都可以通过调用object类提供的getClass()方法获取该类的class对象。
date.getclass()
2).“类名称.class”可以直接根据某个具体的类(类名称)来获取class对象
java.util.Date.class
3).调用class类的静态方法class.forName(String className)传入类的全名称来获取其class对象
class.forName(java.util.Date)
类加载时就产生了类的class对象用来描述对象。
1.4 反射的应用:取得一个类的class对象后,可以通过反射来实例化对象
1)在class中有如下方法:
classz.newInstance(),实际上调用的是类中的无参构造,并且无参构造必须是public修饰的
会抛出InstantiationException, IllegalAccessException
eg:Class<Date> class = (Class<Date>)Class.forName("java.util.Date");
Date date = class.newInstance();
2.反射与类操作
1).通过反射取得父类、父接口的信息
(1)取得类的包的名称:
public Package getPackage();
获取具体的名称:
public Package getPackage().getName();
(2)取得父类的class对象(父类单继承)
public native Class<? super T> getSuperClass();
(3)取得实现的父接口([] -- 接口多继承)
public Class<?>[] getInterfaces();
Class<?> classz = Date.class;
//获取父类信息
System.out.println(classz.getSuperClass.getName());
//获取父接口
Class<?>[] cl = classz.getInterfaces();
for(Class c : cl){
System.out.println(cl.getName());
}
(4)基本数据类型在反射中也有class存在,产生的对象还是基本数据类型。
Intger 反射回来的结果是Java.lang.Intger
2).反射调用类中的构造方法--constructor(描述类中的构造方法)
(1)取得类中的指定参数的构造
public Constructor<T> getConstructor(构造方法的参数的类型.class),只能取得类中public权限的构造方法
public Constructor<T> getDeclareConstructor(...),可以取得类中的全部构造方法,包含私有的方法
(2)获取类中所有的构造方法
public Constructor<T>[] getConstructors() throws SecurityException
public Constructor<T>[] getDeclareConstructors throws SecurityException
constructor类提供了实例化对象的方法:
public void newInstance(Object ... initargs):可以调用类的其他构造,包括无参构造
3).反射调用类中的普通方法 - Method(描述类中的普通方法)
(1)取得类中的指定名称的普通方法
public Method getMethod(String name(方法的名称), Class<?> ... parameterTypes(参数类型,普通方法可能有重载))
public Method getDeclareMethods(String name, Class<?> ... parameterTypes)
(2)取得类中的所有普通方法
public Method[] getMethods() throws SecurityException。该方法取得本类及父类中所有的普通方法
public Method[] getDeclareMethods() throws SecurityException。该方法只能取得本类中的全部普通方法,包含私有方法。
Method提供类中调用类中的普通方法的API
public Object invoke(Object obj(具体的某个对象), Object ..(可变参数))
5).描述类的普通属性
set(Object obj, Object value(属性值))
get(Object obj)