概述

  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

转|java反射方法和使用的更多相关文章

  1. 【译】5. Java反射——方法

    原文地址:http://tutorials.jenkov.com/java-reflection/methods.html ====================================== ...

  2. Java反射-方法(Method)

    工作了三年,第二次使用反射! 遇到的问题描述: 多个页面查询后,返回的List中的对象属性为“.00”,页面显示不友好. 查询原因是因为查询数据的SQL为:to_char(a.applyAmount, ...

  3. Java 反射 方法调用

    在使用Java 反射时,对方法的调用,可能碰到最多的问题是,方法的变量如何使用.其实,调用方法的变量全部在参数数组里,不管有多少个参数,你都要把它放在参数数组里,如果是单个非数组参数,则可不使用参数数 ...

  4. java反射——方法

    大家都知道反射技术在Java里面时非常重要的一个技术点,因为Java好多框架的编写都是基于反射的,别的不多说,spring框架里面的IOC就是基于反射实现.那么什么是反射呢?JAVA反射机制是在运行状 ...

  5. java反射--方法反射的基本操作

    方法的反射 1)如何获取某个方法 方法的名称和方法的参数列表才能唯一决定某个方法. 2)方法反射的操作 method.invoke(对象,参数列表). 代码实例: package com.reflec ...

  6. Java反射方法总结

    1.得到构造器的方法 Constructor getConstructor(Class[] params) -- 获得使用特殊的参数类型的公共构造函数, Constructor[] getConstr ...

  7. 【译】7. Java反射——私有字段和私有方法

    原文地址:http://tutorials.jenkov.com/java-reflection/private-fields-and-methods.html =================== ...

  8. Java 反射机制学习资料

    Java反射——引言 Java反射——Class对象 Java反射——构造函数 Java反射——字段 Java反射——方法 Java反射——Getter和Setter Java反射——私有字段和私有方 ...

  9. Java反射——引言

    Java反射——引言 原文地址:http://tutorials.jenkov.com/java-reflection/index.html *By Jakob Jenkov Java的反射机制使得它 ...

  10. 【译】1. Java反射——引言

    原文地址:http://tutorials.jenkov.com/java-reflection/index.html *By Jakob Jenkov Java的反射机制使得它可以在运行时检查类.接 ...

随机推荐

  1. ESP AT指令使用记录

    一.前言 本篇文章主要用于记录自己在使用AT指令时候的流程,记录一些资料与程序等.如果能帮到你,请给我点个赞. 二.背景知识 ESP-AT是什么? ESP-AT 是乐鑫开发的可直接用于量产的物联网应用 ...

  2. .NET 9.0 全栈技术的高效开源低代码平台(Vue3+Element-Plus)

    前言 推荐一款基于.NET 9.0 全栈框架的新一代技术架构(Vue3+Element-Plus),开源低代码平台-Microi吾码. 平台不仅无限制地支持用户数.表单数.数据量及数据库数量,还通过跨 ...

  3. 【Matlab】输出变量内容到xls文件

    版本: matlab 2017a 功能:将矩阵输出一个excel文件 代码: function [ statu ] = write2xls( x,filename,sheet) % 返回值: % 1 ...

  4. ITSM运维管理整理总结

    ITSM 和我们平常所说的软件管理最大的不同? 目标不是管理技术,主要任务是管理用户和客户的IT需求 2.人员.技术.流程[重要] 3.几大模块 模块名称 干什么 备注 服务台 1.对接客户的前方,负 ...

  5. Selenium 测试介绍

    本文会从以下下几个方面介绍Selenium,相信大家阅读后会对Selenium有一个全新的认识.  为什么是Selenium  初探Selenium  Selenium组成  Selenium ...

  6. 关于DC1的渗透报告:

    打开DC1,发现我们需要登录DC1,但是我们不知道密码,所以我们只能扫描分析一下他的IP地址,在kali中我们用nmap来扫描发现 DC1的IP地址也许是192.168.42.130,我们看看他开了什 ...

  7. 【Loongson】支持AXI总线接口

    概述 支持axi接口.但其实没有burst,没有cache,没有tlb,所以仿真起来全是空泡,冲突转发相关功能正确性就测不出来. 从sram改为axi:等待时间从一拍到看信号握手 主要更改/bug处: ...

  8. Redis 原理 - Set

    Set数据结构 使用 intset 当同时满足下面两个条件时,使用 intset 存储数据 元素个数少于512个 (set-max-intset-entries: 512) 所有元素都是整数值 不满足 ...

  9. K8s Ingress, 你这个老6

    本文是有态度马甲的第185篇原创. 本文记录了k8s中核心对象Ingress的产生背景和实现机制. 我们都知道k8s Service是一种将Pods通过网络暴露出来的抽象,每个服务定义了一组有关Pod ...

  10. CH9120 TFTP使用详解

    一.TFTP简介: TFTP是基于UDP应用层的简单的文件传输协议,端口号为69,TFTP协议主要应用于网络引导.配置文件传输等场景. 二.报文介绍: TFTP有四种数据包格式,分别是读/写请求包.文 ...