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

    前言:

    反射库(reflect library)提供了一个非常丰富且精心设计的工具集,以便于编写能够动态操纵Java代码的程序。这项功能被大量的应用于JavaBean中,它是Java组件的体系结构。
    使用反射,在设计或者是运行时添加新的类,能够快速的应用开发工具动态的查询新添加类的功能。
    Class类:可以通过Class这个专门的Java类访问类的信息。Class类实际上是泛型类,例如Class<?> perClazz = null;。在大多数情况下,可以忽略类型参数,而使用原始的Class类。
    一.什么是反射?
    能够分析类能力的程序称为反射。反射机制是在运行状态中:对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性。

    二、反射提供的功能?
    在运行时判断任意一个对象所属的类。
    在运行时构造任意一个类的对象。
    在运行时判断任意一个类所具有的成员变量和方法。
    在运行时调用任意一个对象的方法。
    生成动态代理。
    三、获取Class类对象的三种方法:
    Class.forName(“全类名”);
    XX.class;
    对象.getClass();
    package com.uzz.test;

    import com.uzz.entity.Person;

    public class ReflectDemo01 {
    // 通过反射获取类
    public static void demo01() {
    /**
    * 获取反射对象(反射入口) 1.Class.forName(全类名) 2.XX.class 3.对象.getClass()
    */

    // 第一种:通过字符串拿到类
    Class<?> perClazz = null;
    try {
    perClazz = Class.forName("com.uzz.entity.Person");
    System.out.println(perClazz);
    } catch (ClassNotFoundException e) {
    e.printStackTrace();
    }

    // 第二种:类名.class
    Class<?> perClazz2 = Person.class;
    System.out.println(perClazz2);

    // 第三种:对象.getClass()
    Person person = new Person();
    System.out.println(person.getClass());

    }

    public static void main(String[] args) {
    demo01();
    }
    }

    四、通过反射获取所有的公共方法(1.本类 以及 父类 2.符合访问修饰符规律)以及获取当前类的所有方法
    package com.uzz.test;

    import java.lang.reflect.Method;

    public class ReflectDemo02 {

    /**
    * 获取方法
    *
    */
    public static void demo02() {
    // Class入口
    Class<?> perClazz = null;
    try {
    perClazz = Class.forName("com.uzz.entity.Person");
    } catch (ClassNotFoundException e) {
    e.printStackTrace();
    }

    // 获取所有的公共的方法(1.本类 以及 父类、接口中的所有方法 2.符合访问修饰符规律)
    Method[] methods = perClazz.getMethods();
    for (Method method : methods) {
    System.out.println(method);
    }

    System.out.println("=================获取所有方法=====================");
    // 获取当前类的所有方法(1.只能是当前类 2.忽略访问修饰符限制)
    Method[] declaredMethods = perClazz.getDeclaredMethods();
    for (Method method : declaredMethods) {
    System.out.println(method);
    }
    }
    public static void main(String[] args) {
    demo02();
    }
    }

    五、通过反射获取当前类的所有接口
    package com.uzz.test;

    public class ReflectDemo03 {

    // 获取所有的接口
    public static void demo03() {
    Class<?> perClazz = null;
    try {
    perClazz = Class.forName("com.uzz.entity.Person");
    } catch (ClassNotFoundException e) {
    e.printStackTrace();
    }

    // 拿到当前类的接口
    Class<?>[] interfaces = perClazz.getInterfaces();
    // 遍历
    for (Class<?> inter : interfaces) {
    System.out.println(inter);
    }
    }

    public static void main(String[] args) {
    demo03();
    }
    }

    六、通过反射获取当前类的父类
    package com.uzz.test;

    public class ReflectDemo04 {

    // 通过反射获取当前类的父类
    public static void demo04() {
    Class<?> perClazz = null;
    try {
    perClazz = Class.forName("com.uzz.entity.Person");
    } catch (ClassNotFoundException e) {
    e.printStackTrace();
    }

    Class<?> superclass = perClazz.getSuperclass();
    System.out.println(superclass);
    }

    public static void main(String[] args) {
    demo04();
    }
    }
    七、通过反射获取所有的构造方法
    package com.uzz.test;

    import java.lang.reflect.Constructor;

    public class ReflectDemo05 {

    // 通过反射获取所有的构造方法
    public static void demo04() {
    Class<?> perClazz = null;
    try {
    perClazz = Class.forName("com.uzz.entity.Person");
    } catch (ClassNotFoundException e) {
    e.printStackTrace();
    }
    Constructor<?>[] constructors = perClazz.getConstructors();
    for (Constructor<?> constructor : constructors) {
    System.out.println(constructor);
    }
    }

    public static void main(String[] args) {
    demo04();
    }
    }

    八、通过反射获取所有的公共属性
    package com.uzz.test;

    import java.lang.reflect.Field;

    public class ReflectDemo06 {

    // 通过反射获取所有的公共属性
    public static void demo06() {
    Class<?> perClazz = null;
    try {
    perClazz = Class.forName("com.uzz.entity.Person");
    } catch (ClassNotFoundException e) {
    e.printStackTrace();
    }

    Field[] fields = perClazz.getFields();
    for (Field field : fields) {
    System.out.println(field);
    }
    }

    public static void main(String[] args) {
    demo06();
    }
    }

  • 相关阅读:
    借助baidu的jsonp接口,做一个自己的候选词组件
    Cannot set property 'innerHTML' of null
    Win下端口占用问题:OSError: [WinError 10013] 以一种访问权限不允许的方式做了一个访问套接字的尝试
    一文读懂ES6(附PY3对比)
    Wireshark:couldn't run dumpcap in child process(附带Linux下探索过程)
    一个模块导入的简单小测试
    万物互联之~网络编程加强篇
    网罗天下之~正则表达
    (转)RTSP协议详解
    (转)HLS协议,html5视频直播一站式扫盲
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13273243.html
Copyright © 2011-2022 走看看