Java 高级基础——反射

反射的意义:Java 强类型语言,但是我们在运行时有了解、修改信息的需求,包括类信息、成员信息以及数组信息。

基本类型与引用类型

基本类型,(固定的 8 种)

整数:byte, short, int, long

小数:float, double

字符:char

布尔值:boolean

引用类型

所有的引用类型都继承自 java.lang.Object

类,枚举,数组,接口都是引用类型

java.io.Serializable 接口,基本类型的包装类(比如 java.lang.Double)也是引用类型

获得class对象的三种方式

  1. 调用Object类的getClass()方法来得到Class对象,该方法用于返回调用该方法的对象的所属类关联的Class对象。
MyObject x;
Class c1 = x.getClass();
  1. 使用Class类的中静态forName()方法获得与字符串对应的Class对象。
Class c2=Class.forName("MyObject")
  1. 如果T是一个Java类型,那么T.class就代表了匹配的类对象。例如
 Class cl1 = Manager.class;
Class cl2 = int.class;
Class cl3 = Double[].class;

Class类的常用方法

一个 Class 可以被以下修饰符的一种或者多种修饰:

访问权限控制符:public, protected, private

抽象的、需要实现的:abstract

限制只能有一个实例的:static

不允许修改的:final

线程同步锁:synchronized

原生函数:native

采用严格的浮点精度:strictfp

接口

注解

  1. getName()

    一个Class对象描述了一个特定类的属性,Class类中最常用的方法getName以 String 的形式返回此 Class 对象所表示的实体(类、接口、数组类、基本类型或 void)名称。
  2. newInstance()

    创建对象实例,newInstance()方法调用默认构造器(无参数构造器)初始化新建对象。
  3. getClassLoader()

    返回该类的类加载器。
  4. getSuperclass()

    返回表示此 Class 所表示的实体(类、接口、基本类型或 void)的超类的 Class。
  5. isArray()

    判定此 Class 对象是否表示一个数组类。
  6. getMethod()

    根据方法名称和参数类型获取方法,String name, Class<?>... parameterTypes,方法参数可能有一个也可能有多个,由于java具有重载的特性,一个类中可能同时存在多个同名方法,所以参数类型必须指定。该方法可以获得类的公有方法,包括自身的所有public方法,和从基类继承的、从接口实现的所有public方法。
  7. getDeclaredMethod()

    获取的是类自身声明的所有方法,包含public、protected和private方法。

method用法

方法可以被以下修饰符修饰:

访问权限控制符:public, protected, private

限制只能有一个实例的:static

不允许修改的:final

抽象,要求子类重写:abstract

预防重入的同步锁:synchronized

用其他语言实现的方法:native

严格的浮点型强度:strictfp

注解

  1. method.invoke()

    用于执行方法,参数Object obj, Object... args,第一个是调用的对象,第二个是方法需要传入的参数,参数按顺序传入。
  2. getAnnotatedReturnType()

    方法返回目标方法的返回类型的Type对象。如果目标方法被声明为返回void,则该方法返回void.class。
  3. getGenericParameterTypes()

    该方法返回目标方法所有参数类型的Type对象数组,这些Type对象将按照参数的声明顺序存储于在数组中。如果目标方法没有任何参数,则该方法返回一个空数组。
  4. getParameters()

    获取方法参数名称

Field用法

  1. getType()

    返回变量的类型
  2. getDeclaredField()

    获取变量的值,此方法可以获得私有变量。注意:射获取或者修改一个变量的值时,编译器不会进行自动装/拆箱。
  3. getField()

    获得公有public变量

Java 可变参数方法

public void testVarargs(String... strings){
//...
}

创建时必须放在方法尾部,即一个方法只能有一个可变数组参数

调用时可以传入一个数组:

testVarargs(new String[]{"shixin","zhang"});

也可以分别传入多个参数:

testVarargs("shixin","zhang");

Java 高级基础——反射的更多相关文章

  1. Java高级特性——反射机制(第二篇)

    在Java高级特性——反射机制(第一篇)中,写了很多反射的实例,可能对于Class的了解还是有点迷糊,那么我们试着从内存角度去分析一下. Java内存 从上图可以看出,Java将内存分为堆.栈.方法区 ...

  2. Java高级特性——反射机制(第三篇)

    获取类运行时的结构 通过反射获取运行时类的完整结构 Field.Method.Constructor.Superclass.Interface.Annotation >实现的全部接口 >所 ...

  3. Java高级特性——反射

    感谢原文作者:peter_RD_nj 原文链接:https://www.jianshu.com/p/9be58ee20dee 注意:同一个类在JVM中只存在一份字节码对象 概述 定义 JAVA反射机制 ...

  4. java高级——暴力反射

    反射,java中一个比较高级的应用,主要和开发中的框架紧密相连.今天我们就介绍一下他的特性之一,暴力反射.(听名字很恐怖呦) package wo; public class A{ public St ...

  5. Java框架基础——反射(reflect)

    一.Class类的使用 1)在面向对象(oop)的世界里,万事万物皆对象. 在Java中,包括基本的数据类型,都是对象. Class c = int.class;//int 的类类型 那就是说: 类是 ...

  6. Java高级特性—反射和动态代理

    1).反射 通过反射的方式可以获取class对象中的属性.方法.构造函数等,一下是实例: 2).动态代理 使用场景: 在之前的代码调用阶段,我们用action调用service的方法实现业务即可. 由 ...

  7. Java编程基础-反射

    一.java反射 1.反射:动态获取类的信息,以及动态调用对象的方法的功能.可以理解为动态看透类的能力. 2.主要功能:在运行时判断任意一个对象所属的类:在运行时构造任意一个类的对象:在运行时判断任意 ...

  8. JAVA高级特性反射和注解

    反射: 枚举反射泛型注解.html34.3 KB 反射, 主要是指通过类加载, 动态的访问, 检测和修改类本身状态或行为的一种能力, 并能根据自身行为的状态和结果, 调整或修改应用所描述行为的状态和相 ...

  9. Java高级特性——反射机制(完结)——反射与注解

    按照我们的学习进度,在前边我们讲过什么是注解以及注解如何定义,如果忘了,可以先回顾一下https://www.cnblogs.com/hgqin/p/13462051.html. 在学习反射和注解前, ...

随机推荐

  1. 刷新SQL Server所有视图、函数、存储过程

    刷新SQL Server所有视图.函数.存储过程 更多   sql   此脚本用于在删除或添加字段时刷新相关视图,并检查视图.函数.存储过程有效性. [SQL]代码 --视图.存储过程.函数名称 DE ...

  2. CentOS iptables防火墙的基本应用讲解

    iptables是Linux下不错的防火墙软件,本文主要给大家介绍下iptables的安装.规则增加和清除.开放指定端口.屏蔽指定ip和ip段等CentOS下iptables的基本应用. 一.ipta ...

  3. Educational Codeforces Round 37-F.SUM and REPLACE题解

    一.题目 二.题目链接 http://codeforces.com/contest/920/problem/F 三.题意 给定$N$个范围在$[1, 1e6)$的数字和$M$个操作.操作有两种类型: ...

  4. icape3 的使用

    在FPGA中,有时需要使用用户代码重配置FPGA,配置的内容可以是flash或者是其他的来源这样FPGA的启动模式有关,在本实验中配置文件是存放在flash中.实际的操作步骤如下: 1:生成一个工程, ...

  5. Spring batch学习 详细配置解读(3)

    第一篇讲到普通job 配置 那么spring  batch 给我们提供了丰富的配置,包括定时任务,校验,复合监听器,父类,重启机制等. 下面看一个动态设置读取文件的配置 1.动态文件读取 <?x ...

  6. webdriver定位页面元素时使用set_page_load_time()和JavaScript停止页面加载

    webdriver定位页面元素时使用set_page_load_time()和JavaScript停止页面加载 原文:https://my.oschina.net/u/2344787/blog/400 ...

  7. Django框架之模板语法【转载】

    Django框架之模板语法 一.什么是模板? 只要是在html里面有模板语法就不是html文件了,这样的文件就叫做模板. 二.模板语法分类 一.模板语法之变量:语法为 {{ }}: 在 Django ...

  8. 「小程序JAVA实战」小程序的springboot后台拦截器(61)

    转自:https://idig8.com/2018/09/24/xiaochengxujavashizhanxiaochengxudespringboothoutailanjieqi60/ 之前咱们把 ...

  9. 跟我学算法-吴恩达老师(mini-batchsize,指数加权平均,Momentum 梯度下降法,RMS prop, Adam 优化算法, Learning rate decay)

    1.mini-batch size 表示每次都只筛选一部分作为训练的样本,进行训练,遍历一次样本的次数为(样本数/单次样本数目) 当mini-batch size 的数量通常介于1,m 之间    当 ...

  10. JSF多列预选择

    <script type="text/javascript"> jQuery(document).ready(function () { preSelect(); }) ...