zoukankan      html  css  js  c++  java
  • Java反射(一)

    将之前学的Java反射进行一个汇总记录。

    1. Class对象实例化

    Java反射机制就是通过Class对象创建对应实例,并调用相关方法。首先是需要有Class对象,有三种获取Class对象的方式:

    (1)Object.getClass(),如Person p = new Person;对应的Class对象为p.getClass().

    (2)类.class,如Person.class

    (3)Class.forName(),如Class.forName("com.xxx.Person");

    2.反射实例化对象

    拿到类的Class对象,可通过反射进行实例化。有两种方式:

    (1)clazz.newInstance()  在1.9版本被标注@Deprecated(since="9")

    (2)clazz.getDeclaredConstructor().newInstance()  该方法可以抛出InvocationTargetException 和 NoSuchMethodException两个异常

    3.反射与工厂设计模式

    利用Class.forName()方法和clazz.getDeclaredConstructor().newInstance()可以实现类实例化的工厂设计模式,如下:

    class Factory{
        private Factory(){}
    
        public static <T> T getInstance(String className, Class<T> clazz){
            T instance  = null;
            try{
               instance = (T) Class.forName(className).getDeclaredConstructor().newInstance();
            }catch (Exception e){
    
            }
            return instance;
        }
    }

    4.反射与类操作

    (1)获取包信息:public Package getPackage()  其中Package implements AnnotatedElement,AnnotatedElement标注可以返回对应注解

    (2)获取继承的父类:public Class<? super T> getSuperclass()

    (3)获取实现的接口:public Class<?>[] getInterfaces()

    (4)获取构造方法:

        获取全部构造方法:public Constructor<?>[] getDeclaredConstructors()

        获取指定构造方法:public Constructor<T> getDeclaredConstructor​(Class<?>... parameterTypes),其中参数为参数类型,如String.class等

    (5)获取方法:

        获取全部方法(包含父类):public Method[] getMethods()

        获取指定方法(保安父类):public Method getMethod​(String name,Class<?>... parameterTypes),其中name为方法名,后边为方法参数类型

        获取本类全部方法:public Method[] getDeclaredMethods()

        获取本类指定方法:public Method getDeclaredMethod​(String name,Class<?>... parameterTypes),其中name为方法名,后边为方法参数类型

      Method中重要的方法为:public Object invoke​(Object obj, Object... args),其中第一个参数为对象实例,第二个参数为method的参数。反射方法调用主要通过该方法进行。

    (6)获取属性

        获取全部属性(包含父类和接口的所有public属性):public Field[] getFields()

        获取指定属性(包含父类和接口的所有public属性):public Field getField​(String name)

        获取本类全部属性(不包含继承的属性):public Field[] getDeclaredFields()

        获取本类指定属性:public Field getDeclaredField​(String name)

      Field中重要的方法:public Class<?> getType(),返回属性类型。

    (7)底层有个Unsafe工具类,可以通过该类绕过JVM实例化对象,但程序中不建议使用。

  • 相关阅读:
    了解语言学习的四个阶段,孩子的英语学习更从容
    MySQL 修改字段类型或长度
    js中退出语句break,continue和return 比较
    PHP中unset,array_splice删除数组中元素的区别
    php判断一个数组是另一个数组的子集
    PHP实现一维数组转二维数组的方法
    基于 HTML5 WebGL 的 3D 网络拓扑图
    SQL 2008下载地址以及全新安装详细过程
    php从数组中取出一段 之 array_slice
    Linux命令:cp (copy)复制文件或目录
  • 原文地址:https://www.cnblogs.com/shuimuzhushui/p/12681036.html
Copyright © 2011-2022 走看看