zoukankan      html  css  js  c++  java
  • 浅谈Java反射

    什么是反射?

    JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。通俗一点讲反射就是对象的反向处理。

    下面我们具体说明反射的一些操作

    1.三种获取Class对象的方法:

    1.Class classz = 类对象.getClass();
    2. Class classz = 类名.class;
    3. Class classz = Class.forName("类名");
    classz.getName();获取包名+类名
    classz.getSimpleName();获取类名
    
    三者区别:1和2可以编译时检查,3受查时异常,异常名为ClassNotFindException

    2.通过反射获取父类的信息

    2.1获取当前类的父类对象
    classz.getSuperclass()  //包名+类名
    classz.getSuperclass().getName() //类名
    
    2.2获取当前类实现的接口
    public Class<?>[] getInterfaces();
    claszz.getInterfaces();

     

    3.通过反射调用构造

    3.1获取指定参数类型的构造方法
    public Constructor<?> getConstructor(Class<?> parameterTypes)
    3.2获取类中所有构造
    public Constructor<?>[] getConstructors()

    以上的操作是直接利用了Constructor类中的toString()方法取得了构造方法的完整信息(包含方法权限,参数列表),
    而如果你只使用了getName()方法,只会返回构造方法的包名类名。
    4.newInstance方法,cls.newInstance(),调用toString()方法输出,调用该方法时,必须使类有无参构造方法,
    如果木有无参构造方法,则只能通过明确的构造调用实例化处理

    5.通过反射获取普通方法

    5.1获取所有公有方法
    public Method[] getMethods() throws SecurityException;
    5.2获取指定方法
    public Method getMethod(String name,Class<?>  parameterTypes,....);
    5.3java.lang.reflect.Method中提供一个调用方法
    public Object invoke(Object o1,Object o2) throws InvocationTargetException,IllegalAccessException,IllegalArgumentException

    6.反射调用类中的属性

    6.1获取父类和子类所有公有的属性
    public Field[] getField() throws SecurityException
    6.2获取父类或者子类中指定属性(公有的)
    public Field getField(String name属性名) throws NoSuchFieldException,SecurityException
    6.3获取本类中的所有的属性(不包含从父类继承的属性)
    public Field[] getDeclareField() throws SecurityException
    6.4获取本类中指定属性(不包含从父类继承的属性)
    public Field getDeclareField(String name属性名) throws NoSuchFieldException,SecurityException
    6.5java.lang.reflect.Field方法提供两个重要的方法
    6.5.1设置属性内容
    public void set(Object obj,Object value) throws IllegalArgumentException
    6.5.2取得属性内容
    public Object get(Object obj) throws IllegalArgumentException,
    IllegalAccessException

    获取属性这块就不给具体实例,如果想仔细了解的话,请看下一篇文章将source类中的属性值赋给target类中对应的属性。

    6.6Java反射继承结构

    AccessibleObject类中有一个方法:
    动态设置封装性
    public void setAccessible(boolean flag) throws SecurityException
    通过此方法我们可以对类中的私有成员属性进行操作,虽然违背了Java面向对象的封装性,但是在实际应用中使代码更加健壮
    6.7获取属性类型
    public Class<?> getType()
    该方法不在此处举例,

    讲了这么多方法和概念,不实战怎么能够掌握这些方法呢,下面我们通过一两个实例带大家进行深入的掌握和理解Java反射,由于篇幅原因,请看下一篇文章,谢谢!

  • 相关阅读:
    什么是基于注解的容器配置?
    一个线程运行时发生异常会怎样?
    Java 中你怎样唤醒一个阻塞的线程?
    为什么 wait, notify 和 notifyAll 这些方法不在 thread 类里面?
    Java 中 notify 和 notifyAll 有什么区别?
    在 Spring MVC 应用程序中使用 WebMvcTest 注释有什么用处?
    java 中有几种方法可以实现一个线程?
    什么是AOP?
    什么是竞争条件?你怎样发现和解决竞争?
    Mybatis 是如何进行分页的?分页插件的原理是什么?
  • 原文地址:https://www.cnblogs.com/du001011/p/10776223.html
Copyright © 2011-2022 走看看