博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【Java基础】反射 - Reflection
阅读量:4005 次
发布时间:2019-05-24

本文共 1672 字,大约阅读时间需要 5 分钟。

能够分析类能力的程序被成为反射(reflective)

Java的反射机制主要提供了一下功能:

  • 在运行时判断任意一个对象所属的类;
  • 在运行时构造任意一个类的对象;
  • 在运行时判断任意一个类所具有的成员变量和方法;
  • 在运行时任意调用一个对象的方法;
  • 在运行时改变fileds的内容;

0. 什么是反射

反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力。

在计算机科学领域,反射是指一类应用,它们能够自描述和自控制。也就是说,这类应用通过采用某种机制来实现对自己行为的描述,并能根据自身行为的状态和结构,调整或修改应用所描述行为的状态和相关的语意。

0.1 Java中的反射

Java语言反射提供一种动态链接程序组件的多功能方法。它允许程序创建和控制任何类的对象,无需提前硬编码目标类。这些特性使得反射特别适用于创建以非常普通的方式与对象协作的库。它使类和数据结构能够按名称动态检索相关信息,并允许在运行着的程序中操作这些信息。

但反射有两个缺点。第一个是性能问题,用于字段和方法接入时反射要远慢于直接代码。性能问题的程度取决于程序中是如何使用反射的。如果它作为程序运行中相对很少涉及的部分,缓慢的性能将不会是一个问题。即使测试中最坏情况下的计时图显示的反射操作中只耗用几毫秒。仅反射在性能关键的应用的核心逻辑中使用时性能问题才变得至关重要。

第二个缺点是安全,可以绕过java的基础安全机制(如“子类无法访问父类的私有属性或方法)

主要涉及的类

1. Class类

2. Constructor类

3. Field类

4. Method类

5. AccessibleObject类

示例

打印类信息

import java.util.*;import java.lang.reflect.*;public class ReflectionTest{	public static void main(String[] args){       ClassAnalyzer.printClass(Integer.class);	}}class ClassAnalyzer{	static public void printClass(Class cl){        System.out.print("class " + cl.getName());        // print super class info        Class superCl = cl.getSuperclass();        if (superCl != null && superCl != Object.class){            System.out.print(" extends " + superCl.getName());        }        // print interfaces info        Class[] interfaces = cl.getInterfaces();        for (int i = 0; i < interfaces.length; i++){        	if (i == 0){        		System.out.print(" implements ");        	}        	        	System.out.print(interfaces[i].getName() + " ");        }                System.out.print("{\n");                System.out.println("}");	}	static public void printConstructor(Class cl){	} 	static public void printMethod(Class cl){	}}
输出:

参考:

你可能感兴趣的文章
昨夜今晨最大八卦终于坐实——人类首次直接探测到了引力波
查看>>
如何优雅、机智地和新公司谈薪水?
查看>>
为什么读了很多书,却学不到什么东西?
查看>>
长文干货:如何轻松应对工作中最棘手的13种场景?
查看>>
如何确保自己的Mac数据安全呢?这里有四个“小秘诀”
查看>>
如何用好碎片化时间,让思维更有效率?
查看>>
第一性原理:戳中问题本质的人是怎么思考的?
查看>>
No.147 - LeetCode1108
查看>>
No.148 - LeetCode771
查看>>
No.174 - LeetCode1305 - 合并两个搜索树
查看>>
No.175 - LeetCode1306
查看>>
No.176 - LeetCode1309
查看>>
FE:http状态码
查看>>
No.182 - LeetCode1325 - C指针的魅力
查看>>
mac:移动python包路径
查看>>
mysql:sql create database新建utf8mb4 数据库
查看>>
mysql:sql alter database修改数据库字符集
查看>>
mysql:sql alter table 修改列属性的字符集
查看>>
mysql:sql drop table (删除表)
查看>>
mysql:sql truncate (清除表数据)
查看>>