Java反射机制

简介

Java反射机制是指在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。用一句话总结就是反射可以实现在运行时可以知道任意一个类的属性和方法。

Class 对象

在java中类也是对象,是Class类的实例对象,这个对象称为该类的类类型 对于普通的对象,我们一般都会这样创建和表示:

Code code = new Code();

上面说了,所有的类都是Class的对象,那么该如何表示呢,是不是可不可以通过如下方式呢:

Class cl = new Class();

但是我们查看Class的源码时,是这样写的:

private Class(ClassLoader loader) {

// Initialize final field for classLoader. The initialization value of non-null

// prevents future JIT optimizations from assuming this final field is null.

classLoader = loader;

}

可以看到构造器是私有的,只有JVM可以创建Class的对象,因此不可以像普通类一样new一个Class对象,虽然我们不能new一个Class对象,但是却可以通过已有的类得到一个Class对象,共有三种方式:

Class objectClass = Object.class;//任何一个类都有一个隐含的静态成员变量class,这种方式是通过获取类的静态成员变量class得到的

Class objectClass = object.getClass();//object是Object的一个对象,这种方式是通过一个类的对象的getClass()方法获得的

Class objectClass = Class.forName("xxx.xxx.Object");//这种方法是Class类调用forName方法,通过一个类的全量限定名获得,一般使用这种方式获取

简单的例子:

Class objectClass1 = User.class;

System.out.println(objectClass1.getName());

User user = new User();

Class objectClass2 = user.getClass();

System.out.println(objectClass2.getName());

Class objectClass3 = Class.forName("com.java.reflection.demo.User");

System.out.println(objectClass3.getName());

执行结果:

com.java.reflection.demo.User

com.java.reflection.demo.User

com.java.reflection.demo.User

类名、包名、父类

我们可以从Class对象中获取两个版本的类名:

Class object = Class.forName("com.java.reflection.demo.User");

object.getName() //全限定类名(包含包名) eg:com.java.reflection.demo.User

object.getSimpleName()//类的名字(不包含包名) eg:User

object.getPackage() //包名 eg:com.java.reflection.demo

object.getSuperClass()//父类 eg:java.lang.Object

修饰符

可以通过 Class 对象来访问一个类的修饰符, 即public,private,static 等等的关键字,你可以使用如下方法来获取类的修饰符:

Class object = Class.forName("com.java.reflection.demo.User");

int modifiers = aClass.getModifiers();

修饰符都被包装成一个int类型的数字,这样每个修饰符都是一个位标识(flag bit),这个位标识可以设置和清除修饰符的类型。 可以使用 java.lang.reflect.Modifier 类中的方法来检查修饰符的类型:

Modifier.isAbstract(int modifiers)

Modifier.isFinal(int modifiers)

Modifier.isInterface(int modifiers)

Modifier.isNative(int modifiers)

Modifier.isPrivate(int modifiers)

Modifier.isProtected(int modifiers)

Modifier.isPublic(int modifiers)

Modifier.isStatic(int modifiers)

Modifier.isStrict(int modifiers)

Modifier.isSynchronized(int modifiers)

Modifier.isTransient(int modifiers)

Modifier.isVolatile(int modifiers)

方法、变量、实现接口、构造函数

可以通过 Class 对象获取 Method 对象,类的成员变量,实现的接口、Constructor类的实例。

Method对象

Method[] methods = Class.forName(className).getMethods();//public方法

//Method[] methods = Class.forName(className).getDeclaredMethods();//private方法

//指定的方法

Method method = cl.getMethod("method");//public

//Method method = cl.getDeclaredMethod("method")//private

成员变量

Field[] fields = Class.forName(className).getFields();//public修饰的成员变量

//Field[] fields = Class.forName(className).getDeclaredFields();//private修饰的成员变量

//指定的成员变量 Field field = Class.forName(className).getDeclaredField("name");

实现的接口

Class[] interfaces = Class.forName(className).getInterfaces();

Constructor类的实例

Constructor[] constructors = Class.forName(className).getConstructors();

//指定的Constructor类的实例

Constructor userConstructor = (Constructor) Class.forName(className).getConstructor(String.class,Integer.class,String.class);

演示demo下载

总结

到此,Java反射机制入门的差不多了,我是复习SpringMVC AOP里面自定义异常处理的时候,里面我们通过Java反射来实现的,希望这篇笔记也对你有用。

参考资料

java反射比较两个model6_java反射机制相关推荐

  1. 深入理解Java类型信息(Class对象)与反射机制

    关联文章: 深入理解Java类型信息(Class对象)与反射机制 深入理解Java枚举类型(enum) 深入理解Java注解类型(@Annotation) 深入理解Java并发之synchronize ...

  2. Java反射及 IoC原理、内省机制

    JAVA反射及IoC原理.JAVA内省 1. 反射 反射是框架设计的灵魂,使用前提:必须先得到代表的字节码的Class,Class类用于表示.class文件(字节码文件). 1.1 反射概述 主要指程 ...

  3. java 内省机制_Java反射及 IoC原理、内省机制

    JAVA反射及IoC原理.JAVA内省 1. 反射反射是框架设计的灵魂,使用前提:必须先得到代表的字节码的Class,Class类用于表示.class文件(字节码文件). 1.1 反射概述主要指程序可 ...

  4. 深入Java类型信息:RTTI和反射

    转载自 「深入Java」类型信息:RTTI和反射 1.RTTI Run-Time Type Infomation 运行时类型信息 为什么需要RTTI? 越是优秀的面向对象设计,越是强调高内聚低耦合,正 ...

  5. java 反射 new class_Java高级特性-反射:不写死在代码,还怎么 new 对象?

    反射是 Java 的一个高级特性,大量用在各种开源框架上. 在开源框架中,往往以同一套算法,来应对不同的数据结构.比如,Spring 的依赖注入,我们不用自己 new 对象了,这工作交给 Spring ...

  6. 【JAVA SE】第十七章 反射、注解与Spring事务底层原理

    第十七章 反射.注解与Spring事务底层原理 文章目录 第十七章 反射.注解与Spring事务底层原理 一.反射 1.简介 2.意义 3.缺点 4.应用场景 5.反射技术的使用 二.注解 1.概念 ...

  7. 反射 数据类型_Java基础:反射机制详解

    一.什么是反射: (1)Java反射机制的核心是在程序运行时动态加载类并获取类的详细信息,从而操作类或对象的属性和方法.本质是JVM得到class对象之后,再通过class对象进行反编译,从而获取t对 ...

  8. ❤️Java面试高频《注解与反射》(建议收藏)❤️

    注解与反射 注解 1.Annotation是从JDK5.0开始引入的新技术 2.Annotation的作用: 不是程序本身,可以对程序做出解释(这一点和注释(comment)没什么却别) 可以被其他程 ...

  9. java基础 —— 集合、异常、反射、io流、多线程

    1.集合 (Collection) #mermaid-svg-Po6HS0iqu2RMZvt5 .label {font-family: 'trebuchet ms', verdana, arial; ...

最新文章

  1. 在.net中运用HTMLParser解析网页的原理和方法
  2. Xilinx Axi Dma Userspace模式下 寄存器 +MMAP 测试程序
  3. C#枚举中的位运算权限分配浅谈
  4. Failed to start bean ‘documentationPluginsBootstrapper‘ StackOverflowError
  5. 2019阿里云910会员节大促主会场全攻略
  6. vue怎么把api 挂载到全局_nvue实现全局挂载
  7. C++ 封装DLL遇到的一些坑爹问题与解决方案
  8. debian安装ibus中文输入法
  9. 利用openmp实现矩阵相乘_MP116:线性代数补习班(4):矩阵的张量积
  10. 数据结构上机实践第七周项目4 - 队列数组
  11. LC-871 最小加油次数
  12. H.264的Slice及Slice类型
  13. 927. 三等分(每日一难phase2--day26)
  14. 阅读《吴军·硅谷来信》一年的回顾与思考
  15. java画哆啦A梦_java绘制哆啦A梦 超可爱
  16. Android 在线PDF文件加载
  17. FUZ-2204-7环形dp
  18. 错误:is quoted with which must be escaped when used within the value
  19. python 实现串口发送数据
  20. 计算机体系结构-精简指令集和复杂指令集

热门文章

  1. linux环境切换python3版本
  2. 数字图像处理与机器视觉——Visual C++与Matlab实现书中代码勘误
  3. 【云炬大学生创业基础笔记】第1章第1节 测试
  4. 科大星云诗社动态20201206
  5. [云炬python3玩转机器学习笔记] 2-6关于回归和分类
  6. sqlserver中查找存储过程中的关键字方法之二
  7. FFmpeg--av_register_all函数分析
  8. badboy测试工具下载
  9. python向数据库插入数据时报错%d format: a number is required, not str
  10. BugkuCTF解题报告---WEB