[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()); ?>