[javaSE] 看知乎学习反射
简单的来说,反射机制指的是程序在运行时能够获取自身的信息。在java中,只要给定类的名字,那么就可以通过反射机制来获得类的所有信息。
知乎:学习java应该如何理解反射?
余晖:
反射提供了一种运行期获取对象元信息的手段。写框架代码用的比较多,因为需要运行时动态获取和操作对象的属性和方法。尽量少用反射,会有性能开销,大多数场景下可以用设计模式代替
知乎:Java 反射到底慢在哪里?
松鼠奥利奥:
对于 Java 的依赖注入容器而言,反射慢在把装载期做的事情搬到了运行期。但这是没有选择的事情,对于 Java 这样的静态语言,如果不这样“搬”,模块将难以被 Mock,从而难以写自动化的单元测试。
动态语言中很少有“依赖注入”的概念了(PHP 这种全盘照抄 Java 的除外),因为 Python、Ruby 这类的动态语言实际上没有装载期,所有装载的事情都是放在运行期做的(比如 import 模块、构造类和函数等)。实际上很少人会去抱怨 Python 写的 Web 应用装载模块太慢,反而很多时候用动态语言的开发者会非常频繁地使用反射和元编程节省编码时间、增加灵活性。因为对于服务器端应用而言,装载是一次性的事情,即使是很慢也只是增加了启动时间。一旦服务器进入运转状态,就没有更多的额外开销了。
知乎:大型多人项目中使用反射机制有什么利弊?
vczh:
反射是用来做library的,不是用来做业务的。程序员就是控制不住自己啊,东西放在那里就一定要用,不然就手痒。
倪炜:
反射机制一般用在逻辑比较固化的框架层面的,业务层面用反射有点蛋疼和装逼了。性能倒不是什么大问题,主要缺陷是反射使静态分析代码执行路径更困难。
java版:
package com.tsh.test; import java.lang.reflect.Method; public class Home { public static void main(String[] args) { Test2 t=new Test2(); t.say(); } } class Test{ public Test() { super(); } public void say(){ } } //使用反射获取Test类的方法 class Test2{ public void say(){ try { Class c=Class.forName("com.tsh.test.Test"); Method[] methods=c.getMethods(); for(Method m:methods){ System.out.println(m.getName()); } } catch (ClassNotFoundException e) { e.printStackTrace(); } } }
PHP中反射是什么?
它是指在PHP运行状态中,扩展分析PHP程序,导出或提取出关于类、方法、属性、参数等的详细信息,包括注释
PHP版:
<?php namespace one; class Test{ public function __construct(){ } public function say(){ } } $reflectionClass=new \ReflectionClass("\one\Test"); print_r($reflectionClass->getMethods()); ?>
相关文章
- JAVA只要掌握内部类,多继承和单继承都不是问题
- 今儿直白的用盖房子为例,给你讲讲Java建造者模式
- 用实例带你深入理解Java内存模型
- 你知道,java项目中是如何获取文件地址的吗?
- 【架构师(第十五篇)】脚手架之创建项目模板开发
- 【架构师(第十六篇)】脚手架之创建项目模板的下载与更新
- 【架构师(第十八篇)】脚手架之项目模板的安装
- 【架构师(第十九篇)】脚手架之组件库模板开发
- 【架构师(第二十篇)】脚手架之自定义模板及第一阶段总结
- 【架构师(第二十一篇)】编辑器开发之需求分析和架构设计
- 【架构师(第二十二篇)】编辑器开发之项目整体搭建
- 【架构师(第二十三篇)】编辑器开发之画布区域组件的渲染
- 【架构师(第二十四篇)】编辑器开发之添加模版到画布
- Java异常处理:如何写出“正确”但被编译器认为有语法错误的程序
- 我以订披萨为例,给女朋友详细讲了Java设计模式的3种工厂模式
- 【架构师(第二十五篇)】编辑器开发之属性编辑区域表单渲染
- 【架构师(第二十六篇)】编辑器开发之属性编辑同步渲染
- 2021年度“CCF-腾讯犀牛鸟基金”发布结题评优结果
- 【架构师(第二十七篇)】前端单元测试框架 Jest 基础知识入门
- 太空噗|重燃太空热潮!与噗噗星人一同探索星海浪漫