反射机制

注解和反射

老子叫甜甜 提交于 2019-11-30 23:40:21
目录 反射 主要目的 硬编码 API 反射的过程: 获得类的类型 获得类的方法或属性 创建类的对象 思考题: 注解 常用注解: 自定义注解: 语法: 通过反射读取注解的内容 作业: 反射 主流框架中大量应用了反射技术 主要目的 对类的结构进行解析,实现代码的解耦 硬编码 Student stu = new Student(1,"张三",20); stu.study(); 反射机制对类的结构进行解析,读取类中的方法和属性,可以动态创建对象,可以实现方法的调用。 API 在java.refect包 Class 类的类型 Method 类的方法 Field 类的属性 Constructor 类的构造方法 反射的过程: 1)获得类的类型 2)获得类的方法或属性 3)创建类的对象 4)调用对象的方法或属性 获得类的类型 1)Class Class.forName("包名+类名") 2)Class 类名.class 3)Class 对象.getClass() 获得类的方法或属性 Method[] getMethods() 获得类中所有方法(包含自己定义的方法和从父类继承的方法) Method[] getDeclaredMethods() 获得类中所有方法(包含自己定义的方法) Method getMethod(String name,Class<?>... paramTypes) 获得特定方法

使用反射机制简单模拟IOC效果

心已入冬 提交于 2019-11-30 15:13:52
package anno; import java.lang.annotation.Annotation; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.Arrays; /** * @program: tx_annotation_demo * @description: 使用反射机制模拟实现IOC(控制反转) * @author: czg * @create: 2019-09-27 22:41 */ public class MySpring { public static void main(String[] args) { //题目:入参:一个包名.类名字符串 出参:一个对应的对象 对象中已存在数据(数据存在无参构造方法的注解中) Person p=(Person)Ioc("anno.Person"); System.out.println(p.toString()); } public static Object Ioc(String ClassName){ Object o =null; try { Class clazz=Class.forName(ClassName); /

Java反射

扶醉桌前 提交于 2019-11-30 12:02:49
简介 反射(Reflection) 是一种运行时检视(Inspect)类型信息并且可以动态操作类中的一切成员的一种机制。它常常用于如下一些场景中: 运行时实例化类的对象,比如实例化一个Servlet类,此Servlet类的名字容器预先是不知道的 运行时调用方法,比如调用Servlet对象的service方法 运行时修改属性值.比如Apache DbUtils工具库可以把数据库的一条记录默认依据名称相同的策略赋值一个对象的字段. JDK中关于反射的相关类型都在 java.lang.reflect 包下,并不需要额外的第三方包来完成反射的工作. Class对象 当jvm加载一个class文件到内存后,会为其创建一个唯一的Class对象(注意:同一个类加载器的前提)。所以我们可以理解为,Class对象就是一个class文件被加载到jvm中后的运行时表现。而反射的首要任务就是得到Class对象.得到Class对象的方法如下: Class.forName("类的全称") 类的class字段 对象的getClass方法 Class.forName() 这种方法适合只知道类的字符串表示,也就是全称的情况.如果类还没有加载它还会加载此类,如果已经加载了就会返回已加载的class对象给你,比如: Class personCls = Class.forName("com.Person");

PHP反射机制原理与用法

China☆狼群 提交于 2019-11-30 07:44:29
反射 反射,直观理解就是根据到达地找到出发地和来源。比如,一个光秃秃的对象,我们可以 仅仅通过这个对象就能知道它所属的类、拥有哪些方法 。 反射是指在PHP运行状态中,扩展分析PHP程序,导出或提出关于类、方法、属性、参数等的详细信息,包括注释。这种动态获取信息以及动态调用对象方法的功能称为反射API。 php类的成员变量没有在类中声明,而是在函数中声明,有什么不同? ReflectionClass: 获取类声明时的结构 ReflectionObject: 可获取类实例化后的结构 代码如下: class test{ private $name; private $sex; function __construct(){ $this->aaa='aaa'; } } $test=new test(); $reflect=new ReflectionClass($test); $pro=$reflect->getDefaultProperties(); print_r($pro);//打印结果:Array ( [name] => [sex] => ) echo $test->aaa;//打印结果:aaa 在这个test类中,声明了两个成员变量$name和$sex,但是在构造函数中,又声明了一个变量$aaa,初始化类,使用反射类打印默认成员属性只有声明的两个成员变量属性,但是打印类的

Java中的反射该如何使用?

萝らか妹 提交于 2019-11-30 02:55:20
1. 什么是反射 反射是一种功能强大且复杂的机制。 Java 反射说的是在运行状态中,对于任何一个类,我们都能够知道这个类有哪些方法和属性。对于任何一个对象,我们都能够对它的方法和属性进行调用。我们把这种动态获取对象信息和调用对象方法的功能称之为反射机制。 2. 反射可以用来做什么 反射能够分析类的能力,反射的机制十分强大,主要可以用来: 在运行时分析类的能力 在运行时查看对象 实现通用的数组操作代码 利用 Method 对象,实现 C++ 中函数指针的功能 3. Class 类 所谓的反射其实是获取类的字节码文件,也就是 .class 文件,而获取 Class 这个对象主要有三种方式: getClass() 函数、 .class 、 forName() 方法,代码如下: package core.java; import java.util.ArrayList; public class Test { public static void main(String[] args) throws ClassNotFoundException { ArrayList<Integer> test = new ArrayList<>(); // 第一种方法 Class a = test.getClass(); System.out.println(a); // 第二种方法 Class b

PHP反射机制

时光总嘲笑我的痴心妄想 提交于 2019-11-30 00:52:06
简介 就算是类成员定义为private也可以在外部访问,不用创建类的实例也可以访问类的成员和方法。 PHP自5.0版本以后添加了反射机制,它提供了一套强大的反射API,允许你在PHP运行环境中,访问和使用类、方法、属性、参数和注释等,其功能十分强大,经常用于高扩展的PHP框架,自动加载插件,自动生成文档,甚至可以用来扩展PHP语言。由于它是PHP內建的oop扩展,为语言本身自带的特性,所以不需要额外添加扩展或者配置就可以使用。更多内容见官方文档。 反射类型 PHP反射API会基于类,方法,属性,参数等维护相应的反射类,已提供相应的调用API。 类型 说明 Reflector Reflector 是一个接口,被所有可导出的反射类所实现(implement) Reflection 反射(reflection)类 ReflectionClass 报告了一个类的有关信息 ReflectionZendExtension 报告Zend扩展的相关信息 ReflectionExtension 报告了PHP扩展的有关信息 ReflectionFunction 报告了一个函数的有关信息 ReflectionFunctionAbstract ReflectionFunction 的父类 ReflectionMethod 报告了一个方法的有关信息 ReflectionObject 报告了一个对象

Java I/O和反射机制

早过忘川 提交于 2019-11-30 00:40:43
简介:Java I/O I :输入 程序读取文件 O:输出 程序往外写文件 技能目标: 一、理解Java中的流 二、会使用字节流读写文件 三、会使用字符流读写文件 四、掌握对象的序列化和反序列化 五、了解反射原理 ————————————————————————————————————— File类 File对象即可表示文件,也可表示目录,在程序中一个File对象可以代表一个文件或目录。利用它可用来对文件或目录进行基本操作。它可以查出与文件相关的信息,如名称、最后修改日期、文件大小等。 File类的常用方法: 1.boolean exists():判断文件或目录是否存在 2.boolean isFile():判断是否是文件 3.boolean isDirectory():判断是否是目录 4.String getPath():返回此对象表示的文件的相对路径 5.String getAbsolutePath():返回此对象表示的文件的绝对路径 6.String getName():返回此对象表示的文件或目录的名称 7.boolean delete():删除此对象指定的文件或目录 8.boolean createNewFile():创建名称的空文件,不创建文件夹 9.long length():返回文件的长度,单位为字节,如果文件不存在,则返回OL 站在程序的角度上 ——————————

java反射机制

心不动则不痛 提交于 2019-11-30 00:08:35
什么是反射 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。 初探 对反射的最初接触是学习jdbc时,加载数据库驱动时会这样写:Class.forName(“com.mysql.jdbc.Driver”),当时似懂非懂的也不知道是什么意思,随着自己的不断学习,越来越感觉反射的神奇,让我们一起来揭开它的神秘面纱吧。 学习一个知识,自然是最先从api开始,反射涉及的类,除了Class类之外,基本上都在java.lang.reflect包里面,常用的类有Constructor,Field,Method类等,AccessibleObject类是前面三个类的基类,主要包含设置安全性检查等方法,下面,我们看一下reflect包的结构 可以看出,涉及的类并不多,让我一起来看一下其中比较常用的类的用法吧 初始化 测试用例采用junit+log4j,新建一个test类,一个javabean 其中name属性get,set方法用private修饰 User类 package com . test ; public class User { private String name = "init" ; private int age ; public

反射

廉价感情. 提交于 2019-11-29 21:05:26
一、什么是反射??   在面向对象的思想中,把对象能够访问、查询、修改自身的状态或行为称为“反射”。 二、python中的反射   Python思想:一切事物皆为对象。   在python中,可以通过字符串的的形式来操作对象的属性。这种行为称之为python中的反射。 三、python实现反射(自省)的手段:   通过4个内置函数来实现:hasattr(object,name) getattr(object,name,default=None) setattr(x,y,v) delattr(x,y) hasattr(object,name) #判断object中有没有一个name字符串对应的方法或属性存在返回True,不存在返回False def delattr(x, y): # real signature unknown; restored from __doc__ """ Deletes the named attribute from the given object. delattr(x, 'y') is equivalent to ``del x.y'' """ pass getattr(object,name,default=None) def getattr(object, name, default=None): # known special case of

Java-反射

空扰寡人 提交于 2019-11-29 19:41:21
反射:框架设计的灵魂 框架:半成品软件。可以在框架的基础上进行软件开发,简化编码 反射:将类的各个组成部分封装为其他对象,这就是反射机制 好处: 1. 可以在程序运行过程中,操作这些对象。 2. 可以解耦,提高程序的可扩展性。 获取Class对象的方式: 1. Class.forName("全类名"):将字节码文件加载进内存,返回Class对象 多用于配置文件,将类名定义在配置文件中。读取文件,加载类 2. 类名.class:通过类名的属性class获取 多用于参数的传递 3. 对象.getClass():getClass()方法在Object类中定义着。 多用于对象的获取字节码的方式 同一个字节码文件(*.class)在一次程序运行过程中,只会被加载一次,不论通过哪一种方式获取的Class对象都是同一个。 Class对象功能: 获取功能: 1. 获取成员变量们 Field[] getFields() :获取所有public修饰的成员变量 Field getField(String name) 获取指定名称的 public修饰的成员变量 Field[] getDeclaredFields() 获取所有的成员变量,不考虑修饰符 Field getDeclaredField(String name) 2. 获取构造方法们 Constructor<?>[] getConstructors