Java继承——反射

反射被大量地应用于JavaBean中

能够分析类能力的程序称为反射

反射作用:

    在运行时分析类的能力

    在运行时查看对象

    实现通用的数组操作码

    利用Method对象

1.Class类:

    在程序运行期间,Java运行时系统始终为所有的对象维护一个被称为运行时的类标识。这个信息跟踪每个对象所属类。虚拟机利用运行时类型信息选择相应的方法执行。可以通过专门的Java类访问这些信息,保存这些信息的类被称为Class类

    Object类中的getClass()方法返回Class类型实例 Class cl = e.getClass();

    或者使用静态方法forName()获得类名对应的Class对象Class cl = Class.forName(className);

    或者Class cl = T.class; T是任意的Java类型

    Class类实际上一个泛型类,例如Employee.class的类型是Class<Employee>

  虚拟机为每一个类型管理一个Class对象,所以可以利用==运算符实现类对象比较的操作,例如:if(e.getClass()==Employee.class)...

    e.getClass().newInstance()可以动态地创建一个类的实例,newInstance方法调用默认的构造器,如果没有默认构造器就会抛出异常

2.java.lang.Class 1.0:

    static Class forName(String className)

    返回描述类名为className的Class对象

    Object newInstance()

    返回这个类的一个新实例

3.java.lang.reflect.Constructor 1.1:

    Object newInstance(Object[] args)

    构造一个这个构造器所属类的新实例

4.java.lang.Throwable 1.0:

    void printStackTrace()

    将Throwable对象和栈的轨迹输出到标准错误流

5.利用反射分析类的能力:

    反射机制最重要的内容——检查类的结构

6.java.lang.Class 1.0:

    Field[] getFields() 1.1

    Field[] getDeclaredFields() 1.1

    getFields方法将返回一个包含Field对象的数组,这些对象记录了这个类或其超类的公有域。getDeclaredFields方法也将返回包含Field对象的数组,这些对象记录了这个类的全部域。如果类中没有域,或者Class对象描述的是基本类型或数组类型,这些方法将返回一个长度为0的数组

    Method[] getMethods() 1.1

    Method[] getDeclaredMethods() 1.1

    同上,只不过返回的是方法

    Constructor[] getConstructors() 1.1

    Constructor[] getDeclaredConstructors() 1.1

    同上,只不过返回的是构造器

7.java.lang.reflect.Field 1.1

/java.lang.reflect.Method 1.1

/java.lang.reflect.Constructor 1.1:

    Class getDeclaringClass()

    返回一个用于描述类中定义的构造器、方法或域的Class对象

    Class[] getExceptionTypes()(在Constructor和Method类中)

    返回一个用于描述方法抛出的异常类型的Class对象数组

    int getModifiers()

    返回一个用于描述构造器、方法或域的修饰符的整型数值。使用Modifier类中的方法可以分析这个返回值

    String getName()

    返回一个用于描述构造器、方法或域名的字符串

    Class[] getParameterTypes()(在Constructor和Method类中)

    返回一个用于描述参数类型的Class对象数组

    Class getReturnType()(在Method类中)

    返回一个用于描述返回类型的Class对象

8.java.lang.reflect.Modifier 1.1:

    static String toString()

    返回对应modifiers中位设置的修饰符的字符串表示

    static boolean isAbstract(int modifiers)

    static boolean isFinal(int modifiers)

    static boolean isInterface(int modifiers)

    static boolean isNative(int modifiers)

    static boolean isPrivate(int modifiers)

    static boolean isProtected(int modifiers)

    static boolean isPublic(int modifiers)

    static boolean isStatic(int modifiers)

    static boolean isStrict(int modifiers)

    static boolean isFSynchronized(int modifiers)

    static boolean isVolatile(int modifiers)

    这些方法将检测方法中对应的修饰符在modifiers值中的位

9.在运行时使用反射分析对象,

    java.lang.reflect.AccessibleObject 1.2:

        void setAccessible(boolean flag)

        为反射对象设置可访问标志。flag为true表明屏蔽Java语言检查,使得对象私有属性也可以被查询和设置

        boolean isAccessible()

        返回反射对象的可访问标志的值

        static void setAeecssible(AccessibleObject[] array,boolean flag)

        是一种设置对象数组课访问标志的快捷方法

    java.lang.Class 1.1:

        Field getField(String name)

        返回指定名称的公有域

        Field getDeclaredFields(String name)

        返回类中声明的给定名称的域

    java.lang.reflect.Field 1.1:

        Object get(Object obj)

        返回obj对象中用Field对象表示的域值

        void set(Object obj,Object newValue)

        用一个新值设置Obj对象中Field对象表示的域

10.使用反射编写泛型数组代码:

    因为从一开始就是Object[]的数组永远不能转换成Employee[]数组

    可以写:

    public statci Object goodCopyOf(Object a,int newLength){

        Class cl  = a.getClass();

        if(!cl.isArray()) rerurn null;

        Class componentType = cl.getComponenType();

        int length = Array.getLength(a);

        Object newArray = Array.newInstance(ComponenType,newLength);

        System.arraycopy(a,0,newArray,0,Math.min(length,newLength));

        return newArray;

    }

11.java.lang.reflect.Array 1.1:

    static Object get(Object array,int index)

    static xxx getXxx(Object array,int index)

    (xxx是boolean、byte、char、double、float、int、long、short之中的一种基本类型)

    这些方法将返回存储在给定位置上的给定数组的内容

    static void set(Object array,int index,Object newValue)

    static setXxx(Object array,int index,xxx newValue)

    这些方法将一个新值存储到给定位置上的给定数组中

    static int getLength(Object array)

    返回数组长度

    static Object newInstance(Class componenType,int length)

    static Object newInstance(Class componenType,int[] lengths)

    返回一个具有给定类型、给定维数的新数组

12.调用任意方法:

    反射机制允许你调用任意方法

    java.lang.reflect.Method 1.1:

        public Object invoke(Object implicitParameter,Object[] explicitParamenters)

        调用这个对象所描述的方法,传递给定参数,并返回方法的返回值。对于静态方法,把null作为隐式参数传递。在使用包装器传递基本参数的值时,基本类型的返回值必须是未包装的

猜你喜欢

转载自blog.csdn.net/qq_38386085/article/details/80768998