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. RK3288 开机动画旋转

    CPU:RK3288 系统:Android 5.1 如果开机动画与屏显示方向不一致,有两种方法可以更改开机动画方向. 一.RK3288默认的开机动画是由两张图片组合而成的,可以直接旋转两张图片的方向. ...

  2. 黄聪:如何配置Emeditor实现代码智能识别自动完成功能

    设置方法如图所示: 效果如下图所示:

  3. ACM-Team Tic Tac Toe

    我的代码: #include <bits/stdc++.h> using namespace std; int main() { char a[3][3]; int i,j=0; for( ...

  4. appium的三种等待方式 (还没实践过,记录在此)

    参考:https://testerhome.com/topics/2576

  5. springboot的interceptor(拦截器)的应用

    一.SpringMVC 中的Interceptor 拦截器也是相当重要和相当有用的,它的主要作用是拦截用户的请求并进行相应的处理.在web开发中,拦截器是经常用到的功能.它可以帮我们验证是否登陆.预先 ...

  6. servlet 3.0无需配置web.xml,使用注入方式配置servlet实现登陆功能(服务器需要支持servlet3.0)

    首先申明上面的报错红叉,我也不知道怎么回事.总之能运行. 新建项目时选择java EE6.0,低版本没有servlet3.0. 先看一个基本示例. Test.java是用来测试无需配置文件,无需静态页 ...

  7. 十.jQuery源码分析之.map()

    763行:三个参数. elems:待遍历的数组或对象. callback:回调函数,会在数组的每个元素或对象的每个属性上执行.执行时传入两个参数:数组元素,元素下标;或属性名,属性值. arg:仅限于 ...

  8. centos使用163 yum源

    备份# cp /etc/yum.repos.d/CentOS-Base.repo  /etc/yum.repos.d/CentOS-Base.repo.bak修改# vi /etc/yum.repos ...

  9. 给iOS开发新手送点福利,简述UISwitch的属性和用法

    UISwitch属性 1. onTintColor 处于on时switch 的颜色     switchImage.onTintColor = [UIColor grayColor]; 2.tintC ...

  10. js中的event

    event代表事件的状态,例如触发event对象的元素.鼠标的位置及状态.按下的键等等.event对象只在事件发生的过程中才有效.event的某些属性只对特定的事件有意义.比如,fromElement ...