java 反射

1.反射
    通过照镜子(Class)后可以得到的信息:
    比如能看到属性,方法,构造器,继承某个类,实现某些接口
    方法上的注解,都可以通过反射获取到
    
    Reflection(反射)是Java被视为动态语言的关键,
    反射机制允许程序在执行期借助于Reflection API取得任何类的內部信息,并能直接操作任意对象的内部属性及方法。
    
2.Class类
    Class是描述类的。包含信息如方法,构造器,属性...
    Class 对象只能由系统建立对象
    一个类在 JVM 中只会有一个Class实例
    每个类的实例都会记得自己是由哪个 Class 实例所生成
3.获取Class的3中方式
     //1.可以通过类的.class静态属性获取
     Class clazz = String.class;
     //2.可以通过对象的getClass方法获取
     Class clazz = "AA".getClass();
     //3.可以通过Class类的静态方法forName获取
         //全类名:包名+类名.如果找不到,会抛出ClassNotFoundException
     Class clazz = Class.forName("java.lang.String");
     
4.可以使用反射给类创建对象
    Class类中方法
        newInstance() :为类创建对象.注意点:要求类下需要提供一个空参的构造器
    如:
    Class clazz = Person.class;
    Object obj = clazz.newInstance();
5.类加载器
    系统类的加载器,负责加载用户自定义的类。就是classpath下类
    那么也可以加载classpath下的资源文件
    如:
    在src下建立文件test.properties
    对应着在bin下也存在该文件
    //this.getClass().getClassLoader():系统类加载器
    //getResourceAsStream("test.properties"):加载文件作为输入流
    InputStream in = this.getClass().getClassLoader().getResourceAsStream("test.properties");
6.使用反射获取方法&调用方法
    Class下的方法:
            getMethods() :返回类中的可见的方法(包含父类的)的Method数组
     *         getMethod(String name, Class<?>... parameterTypes) :
     *                     获取指定方法。  name:方法的名字  Class:方法的参数类型
     *         getDeclaredMethods() :获取类中声明的方法(不包含父类的),可以获取私有的
     *         getDeclaredMethod(String name, Class<?>... parameterTypes)
     *                     获取指定方法。  name:方法的名字  Class:方法的参数类型
    Method类
        代表方法的类
        getName():得到方法的名字
         invoke(Object obj, Object... args) :调用方法.obj代表哪个对象,args:方法需要传入的参数
     对于私有方法需要在调用之前设置可访问的
         method.setAccessible(true);
7.使用反射获取属性和调用属性
    Class下的方法
     *     getFields():获取类下所有的可见的属性
     *     getField(String name):获取指定的属性
     *  getDeclaredFields():获取类下声明的属性(包括私有的属性)
     *  getDeclaredField(String name):获取指定属性,包括私有的属性
     * 
     * Field类
     *     代表着属性的类
     *     getName():获取属性的名字
     *  set(Object obj, Object value):设置属性的值。obj:哪个对象  value:给属性设置的值
     *     get(Object obj):获取属性的值。obj代表哪个对象
     * 
     在操作私有属性的时候,需要在之前设置可访问
     *         field.setAccessible(true);
8.使用反射获取和调用构造器(了解)
     Class下的方法:
     *         getConstructors():获取所有的构造器组成Constructor数组
     *         getConstructor(Class... parameterTypes):获取指定的构造器
     * 
     Constructor类
     *         代表着构造器的类
     *         newInstance(Object... initargs) :调用构造器,创建对象
9.通过反射提取注解信息
    getAnnotation(Class<T> annotationClass) :获取指定注解
    getAnnotations() :获取所有的注解
10.反射与泛型结合使用
    Class类下的方法
        getSuperclass() :得到父类的Class
        getGenericSuperclass() :得到带泛型的父类
        
    Type:
        所有类型的接口
        Class类实现了此接口
        子接口:
            ParameterizedType:代表着带泛型的类型
                方法:
                getActualTypeArguments() :返回所有的泛型类型的Type数组
        
    

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陈思哲~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值