• 转|java反射方法和使用


    概述

      java中不通过new关键字获取对象并且使用类对象中的成员变量和方法,第一时间我们会想到可以使用反射去实现这些功能。反射很强大,而且是Spring的常用轮子,故我们学会了它就可以搭配很多东西一起使用,下面一起来学习使用反射吧!

      使用Book类来练习反射,代码如下:
       

    public class Book {
        private Integer id;
        private String name;
        public Integer age;
    
        public Book() {
            System.out.println("Public 无参构造函数");
        }
        public Book(String name) {
            System.out.println("Public 带参构造函数");
        }
        private Book(String name,Double price){
            System.out.println("Private 带两参构造函数");
        }
    
        public void printAll(){
            System.out.println("公开方法");
        }
    
        private void printOne(){
            System.out.println("私有方法");
        }
    }
    

    获取类的三种方式

    第一种:使用Class.forName

    使用 Class.forName(String classPath)时,请求参数classPath写需要反射的类名,一般是以包名.类名。

     try {
        Class clz = Class.forName("com.entity.Book");
      } catch (ClassNotFoundException e) { 
        e.printStackTrace();
      }
    

    第二种:使用类名.class

    使用这种方法时,需要知道有这个类。

    Class clz = Book.class;

    第三种:对象.getClass()

    使用的前提是对象已经被实例化。

    Book book = new Book();
    Class clz = book.getClass();   
        
    总结:这三种方法各有千秋,我们一般使用第一种方式,在开发中,请按照自己的实际需求去使用。

    获取构造函数

    getDeclaredConstructors(); 获取所有的构造函数
    getDeclaredConstructor(参数类型); 获取一个指定参数类型的构造函数
    getConstructors(); 获取所有公共的构造函数
    getConstructor(参数类型); 获取一个指定参数类型的、public修饰的构造函数
     
    使用方法:

      //获取所有的构造函数
            Constructor[] constructors = clz.getDeclaredConstructors();
            //获取单个所有的构造函数
            try {
                Constructor constructor =               
                clz.getDeclaredConstructor(String.class);
            } catch (NoSuchMethodException e) {
                e.printStackTrace();
            }
    
            //获取所有的公开构造函数
            Constructor[] constructors1 = clz.getConstructors();
            //获取单个公开构造函数
            try {
                Constructor constructor = clz.getConstructor(String.class);
            } catch (NoSuchMethodException e) {
                e.printStackTrace();
            }        
    

    获取名字

    返回类型:String,可以反射类名、方法名和构造函数名等等。

    getName();    //获取全名  例如:com.bean.Book
    getSimpleName()  //获取类名 例如:Book
        

    Class clz = Book.class;
    String name1 = clz.getName();
    String name2 = clz.getSimpleName();
    

    获取包

       
    返回类型:Package
       

    Package aPackage = clz.getPackage();

    获取接口

     
    getInterfaces(),
    返回类型:Class[] interfaces

    Class[] interfaces = clz.getInterfaces();

    获取父类/超类

    getSuperclass()
    返回类型:Class superclass
       

    Class superclass = clz.getSuperclass();

    实例化对象

    语法糖:newInstance(Object initargs)
       
    第一种方式
      

    Class clz = Book.class;
      Object obj =  clz.newInstance(); //将创建一个无参book对象
     
    第二种方式

    Class clz = Book.class;
    Constructor constructor = clz.getDeclaredConstructor();   //获得无参构造
    Object obj = constructor.newInstance();    //实例化book对象

    设置访问属性

       

    clz.setAccessible(true)  //可访问
    clz.setAccessible(false)  //不可访问

    //默认是false   
    Field id = clz.getField("age"); //age字段  
    id.setAccessible(true); //设为可访问
    id.setAccessible(false);    //设为不可访问
    

    获取方法

       

    • getMethods():获取所有的公共方法,注意,它会将系统自带的方法也得到
    • getMethod(String name):获取单个公共方法,由参数指定方法名
    • getDeclaredMethods():获取所有的方法,注意:它不会获取系统自带的方法
    • getDeclaredMethod(String name):获取单个的所有方法 参数是可指定方法名
       Class clz = Class.forName("Book");
       Method[] methods = clz.getMethods();    //获取所有的公共方法
       for (Method method : methods) {
           System.out.println(method.getName());
       } 
        Method method = clz.getMethod("printAll"); // 获取单个公共方法
        method.invoke(clz.newInstance(), null); // 调用方法
    
    Method[] methods = clz.getDeclaredMethods(); //获取所有方法
    for (Method method1 : methods) {
       System.out.println(method1.getName());
    }
    Method method1 = clz.getDeclaredMethod("printOne");    //获取单个公共方法
    System.out.println(method1.getName());
    

    调用方法

    method.invoke(Object obj,Object... args)
    obj:如果是实例方法,则传入该方法的类对象;如果是静态方法,写null。
    args:方法的参数值,没有写null,或不写都行

    // 获取单个的public方法,无法获取private方法
    Method method = clz.getMethod("printAll");
    //使用方法
    method.invoke(clz.newInstance(),null); 
    

    结束语

      对于Java反射,您怎么看?欢迎参与话题互动讨论,分享你的观点和看法, 评论区留言哦,喜欢小编文章的朋友请点赞,谢谢您的参与!

    Reference

    [1] https://www.cnblogs.com/liweixml/p/11462813.html

  • 相关阅读:
    .NET简谈设计模式之(适配器模式)
    .NET简谈组件程序设计之(手动同步)
    .NET简谈组件程序设计之(初识远程调用)
    .NET简谈组件程序设计之(初识.NET线程Thread)
    .NET映射设计(Model与UIControl之间的模型关系)
    .NET简谈事务本质论
    .NET简谈组件程序设计之(异步委托)
    向5.4致敬吧 无为而为
    SQL 2005 分析服务基于角色的动态授权 无为而为
    文思创新深圳招聘biztalk 无为而为
  • 原文地址:https://www.cnblogs.com/east7/p/15875879.html
Copyright © 2020-2023  润新知