当前位置: 首页 > news >正文

设计联盟网站企业网站建设cms

设计联盟网站,企业网站建设cms,网站首页列表布局设计,网站移动版怎么做目录 #0.总览 #1. 类的反射 ①介绍 ②获取 ③作用 获取构造函数: 创建实例: 字段操作: 方法操作: 获取修饰符: #2.总结 #0.总览 反射,官方是这样介绍它的: Reflection is a …

目录

#0.总览

#1. 类的反射

①介绍

②获取

③作用

获取构造函数:

创建实例:

字段操作:      

方法操作:

获取修饰符:

#2.总结 


#0.总览

反射,官方是这样介绍它的:

Reflection is a feature in the Java programming language. It allows an executing Java program to examine or "introspect" upon itself, and manipulate internal properties of the program.

翻译过来就是:反射是 Java 编程语言中的一项功能。它允许正在执行的 Java 程序检查或“内省”自身,并作程序的内部属性。

再翻译成人话就是:反射可以让程序可以把本身的各种方法,参数当作变量来使用。 

为什么翻译成“反射”?因为这个过程就像是照镜子:程序通过照镜子知道自己有什么方法和参数。

详细的说,有:

  • 获取类的信息(类名、方法、字段、构造方法等)。
  • 创建类的实例。
  • 调用类的方法、修改字段的值。
  • 动态地加载类和进行方法调用。
  • 与代理息息相关

#1. 类的反射

①介绍

        首先得介绍一下Class类

Class类是反射的核心部分

Class类和真实的类对象不是一个东西!Class类只是包含了对应类关于其涉及反射的一系列操作的类。每个类都会有属于自己的Class对象:

列如 String.class             Integer.class等

尝试输出:

System.out.println(String.class);

会得到 class java.lang.String

这是类的全限定类名,可以看成是类的标识。

②获取

通过一些方法,我们能获得一个类的Class对象:

Class ex1 = Class.forName("java.lang.String");

Class ex2 = String.class;

String string = new String();
Class ex3 = string.getClass();

那获取到Class类有什么用呢? 

③作用

获取构造函数:

拿这个类来举例:

public class Temp {public int a;public int b;private int c = 10;public Temp() {}public Temp(int a) {this.a = a;}private Temp(int a, int b) {this.a = a;this.b = b;}public void sing(){System.out.println("ahhhhhh!");}private void dance(){System.out.println("haaaaaa!");}
}
Class ex = Temp.class;

ex.getConstructor();    ex.getConstructor(int.class);         

这会获得其一个指定的公共构造方法,注意!括号中的参数要这样写上对应的Class类才能获取到!

ex.getDeclaredConstructor();则可以获取到所有构造方法

相对的,Constructor<?>[] constructors = ex.getConstructors();则会获取所有公用构造方法

getDeclaredConstructors同理

       


创建实例:

Constructor constructor = ex.getConstructor(int.class);
Temp obj = (Temp) constructor.newInstance( 30);

这样就根据指定的构造方法创建出了一个指定的实例

       


字段操作: 

Temp obj = (Temp) constructor.newInstance( 30);
Field field = ex.getField("a");
System.out.println(field);
int value = field.getInt(obj); 
System.out.println(value);

这里会输出 30

注意!除了getInt还有getchar等对应基本数据类型,其他的统一为get()

但其实get()也能处理基本数据类型

格式为 Field.get(已实例化的对象)

对于私有变量,无独有偶:getDeclaredField(“c”)即可

但是只能System.out.println(field);,即获取全限定字段名,无法获得具体值!

解决方法在下:

但是对于字段修改: 

如果是公共字段:

field.set(obj, 666); 

就可以完成修改

私有字段是无法修改的!

必须先取消限制:

field.setAccessible(true);

这样才可以让私有字段像公共字段一样可以被查看,修改。


         

方法操作:

对于方法,有了前面的铺垫则简单得多:

对于公共方法:

Class ex = Temp.class;
Constructor constructor = ex.getConstructor();
Temp obj = (Temp) constructor.newInstance();

Method greetMethod = ex.getMethod("sing");
greetMethod.invoke(obj); 

这样就成功执行了sing方法

如果想要获取所有方法

Method[] methods = ex.getMethods();即可

但是必须要有一个已经实例化的对象obj才能正常的通过invoke操作来执行方法!

实际上,执行的方法实际上是已经实例化的obj里面对应的方法!

对于一些函数,可能名字相同但是参数不同,可以仿照构造函数那样加以区分:

Method greetMethod = ex.getMethod("sing",int.class);

Method greetMethod = ex.getMethod("sing",String.class);类似这样来区分

对于私有方法: 

和字段一模一样

在方法名上加上Declared

getDeclaredMethod,getDeclaredMethods

然后得加上greetMethod.setAccessible(true);才能正常操作


获取修饰符:

可以通过类似于:

int x = greetMethod.getModifiers();

来获取任何方法/字段的修饰符,也许你会疑惑为什么是int类型,原因是JAVA中的确是用数字来存储修饰符的,比如说:

public = 1, private = 2protected = 3,default= 4


 获取接口:

获取接口相对来说非常简单:

Class<?>[] interfaces = ex.getInterfaces();

这样便可获取所有ex类所实现的接口


获取注释:

Annotation[] annotations = ex.getAnnotations();

这样就获取了ex类所有的注释内容!

如果想获取方法的注释也非常简单:

Annotation[] annotations = ex.getMethod("xxx").getAnnotations();

(提一句,对于每个注释都是一个单独的类型,假如你需要@CY注释,改成
CY annotation = ex.getMethod("xxx").getAnnotation();也行)

接下来想要提取注释变量什么的就随你了

这种方法可以用来实现公共字段补全


#2.总结 

        归功于反射机制,程序得以对本身进行修改而不依赖于人工修改,也提供了更多的灵活性,

更是为实现动态代理提供了可能。

(我也写了一篇介绍代理的文章,欢迎捧场!)

你也许会发现,这种获取参数,接口,方法是不是很熟悉?是不是我们用的IDE就有点用了这种方式的意思?不然为什么我们写了一个函数就能提示要放什么参数进去?

这的确很像,但实际上IDE是会实时构造一个抽象语法树(AST),它是代码结构的表示。这使得 IDE 能够理解类、方法、字段和参数的存在及其类型。

尽管如此,反射非常重要,java,spring框架里面反射无处不在,

但是,反射的性能开销很大,因为它要在运行中实时解析类,方法,字段,这些原本是在编译时完成的,而且反射无法被编译器进行优化!

所以谨慎使用!

http://www.ds6.com.cn/news/36909.html

相关文章:

  • 外贸公司网站开发步骤中文搜索引擎
  • wordpress制作公司怎么做网站优化
  • 湖南常德文理学院成都专业seo公司
  • 不同的网站有不同的风格杭州关键词优化平台
  • 做网站需要注册什么公司关键词优化排名要多少钱
  • 百度推广是给做网站吗网站推广和seo
  • 绵阳做手机网站网络营销理论基础有哪些
  • 新增网站备案时间网络营销实训个人总结
  • 电商网站的银行支付接入该怎么做提高网站搜索排名
  • 指定图片做logo网站北京seo培训机构
  • 找人做网站定金不退查找网站
  • 商丘市做网站app推广代理
  • 效果好的魔站建站系统宁波百度推广优化
  • 公司业绩怎么发到建设厅网站上关键词优化搜索排名
  • 如何做淘宝联盟网站的推广百度推广的渠道有哪些
  • 上海装修做网站的倒闭了佛山网站定制
  • 有关天猫网站开发的论文奶茶网络营销策划方案
  • 吉林省绥中县城乡建设局网站公司怎么建立自己的网站
  • 做网站原型现成的框架免费seo提交工具
  • wordpress增加边栏宁波seo外包服务
  • 网站设计就业培训学校排名黄山seo公司
  • 建设厅考试网站全球搜索引擎排名2021
  • 邢台做网站推广的地方朝阳区seo技术
  • 武汉网站建站搜索引擎优化的名词解释
  • 网站原型怎么做百度竞价系统
  • 网站前后台模板广州最新消息
  • cms做的电影网站昆明排名优化
  • iphone开发网站网站关键词seo排名
  • 盐城网站优化方案哪个平台做推广效果好
  • 建设信息网站聚合广告联盟