21、反射

1、反射相关的主要API

java.lang.Class : 代表一个类
java.lang.reflect.Method: 代表类的方法
java.lang.reflect.Field: 代表类的成员变量
java.lang.reflect.Constructor: 代表类的构造器
… …

2、Class类的常用方法

方法名                                                                                 功能说明
static Class forName(String name)                 返回指定类名 name Class 对象
Object newInstance()                                 调用缺省构造函数,返回该Class对象的一个实例
getName()                 返回此Class对象所表示的实体(类、接口、数组类、基本类型或void)名称
Class getSuperClass()                                 返回当前Class对象的父类的Class 对象
Class [] getInterfaces()                                         获取当前Class对象的接口
ClassLoader getClassLoader()                                 返回该类的类加载器
Class getSuperclass()                         返回表示此Class所表示的实体的超类的 Class
Constructor[] getConstructors()                 返回一个包含某些Constructor 对象的数组
Field[] getDeclaredFields()                                         返回Field对象的一个数组
Method getMethod(String name,Class … paramTypes) 返回一个Method对象,此对象的形参类型为 paramType

3、获取Class类的实例(四种方法)

1 前提: 若已知具体的类,通过类的 class 属性获取,该方法最为安全可靠,程序性能最高
实例: Class clazz = String.class;
2 前提: 已知某个类的实例,调用该实例的 getClass() 方法获取 Class 对象
实例: Class clazz = “www.atguigu.com”.getClass();
3 前提: 已知一个类的全类名,且该类在类路径下,可通过 Class 类的静态方法forName() 获取,可能抛出 ClassNotFoundException
实例: Class clazz = Class.forName(“java.lang.String”);
4 )其他方式
ClassLoader cl = this.getClass().getClassLoader();
Class clazz4 = cl.loadClass(“ 类的全类名 ”);
 
关于类加载器的一个主要方法: getResourceAsStream(String str): 获取类路径下的指定文件的输入流
InputStream in = null;
in = this.getClass().getClassLoader().getResourceAsStream("exer2\\test.properties");

4、创建运行时类的对象

 
创建类的对象: 调用 Class 对象的 newInstance() 方法
要 求:         1 )类必须有一个无参数的构造器。
                     2)类的构造器的访问权限需要足够。

5、获取运行时类的完整结构

 
1). 实现的全部接口
public Class<?>[] getInterfaces()
确定此对象所表示的类或接口实现的接口。
2. 所继承的父类
public Class<? Super T> getSuperclass()
返回表示此 Class 所表示的实体(类、接口、基本类型)的父类的Class。
 
3). 全部的构造器
public Constructor<T>[] getConstructors()
返回此 Class 对象所表示的类的所有 public 构造方法。
public Constructor<T>[] getDeclaredConstructors()
返回此 Class 对象表示的类声明的所有构造方法。
Constructor 类中:
        取得修饰符 : public int getModifiers();
        取得方法名称 : public String getName();
        取得参数的类型: public Class<?>[] getParameterTypes();
 
4). 全部的方法
public Method[] getDeclaredMethods()
返回此 Class 对象所表示的类或接口的全部方法
public Method[] getMethods()
返回此 Class 对象所表示的类或接口的 public 的方法
Method 类中:
        public Class<?> getReturnType() 取得全部的返回值
        public Class<?>[] getParameterTypes() 取得全部的参数
        public int getModifiers() 取得修饰符
        public Class<?>[] getExceptionTypes() 取得异常信息
 
5). 全部的 Field
public Field[] getFields()
返回此 Class 对象所表示的类或接口的 public Field
public Field[] getDeclaredFields()
返回此 Class 对象所表示的类或接口的全部 Field
Field 方法中:
        public int getModifiers() 以整数形式返回此 Field 的修饰符
        public Class<?> getType() 得到 Field 的属性类型
        public String getName() 返回 Field 的名称。
 
6). Annotation 相关
get Annotation(Class<T> annotationClass)
getDeclaredAnnotations ()
7). 泛型相关
获取父类泛型类型: Type getGenericSuperclass()
泛型类型: ParameterizedType
获取实际的泛型类型参数数组: getActualTypeArguments()
8). 类所在的包 Package getPackage()

6、调用运行时类的指定结构

6.1、调用指定方法

通过反射,调用类中的方法,通过 Method 类完成。步骤:
1. 通过 Class 类的 getMethod(String name,Class…parameterTypes) 方法取得一个Method 对象,并设置此方法操作时所需要的参数类型。
2. 之后使用 Object invoke(Object obj, Object[] args) 进行调用,并向方法中传递要设置的obj 对象的参数信息。
 
Object invoke(Object obj, Object … args)
说明:
1).Object 对应原方法的返回值,若原方法无返回值,此时返回 null
2). 若原方法若为静态方法,此时形参 Object obj 可为 null
3). 若原方法形参列表为空,则 Object[] args null
4). 若原方法声明为 private, 则需要在调用此 invoke() 方法前,显式调用方法对象的setAccessible(true) 方法,将可访问 private 的方法。
 

6.2、调用指定属性

在反射机制中,可以直接通过 Field 类操作类中的属性,通过 Field 类提供的 set() 和get()方法就可以完成设置和取得属性内容的操作。
public Field getField(String name) 返回此 Class 对象表示的类或接口的指定的public的 Field
public Field getDeclaredField(String name) 返回此 Class 对象表示的类或接口的指定的Field
Field 中:
public Object get(Object obj) 取得指定对象 obj 上此 Field 的属性内容
public void set(Object obj,Object value) 设置指定对象 obj 上此 Field 的属性内容

7、动态代理

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值