反射机制

反射

偶尔善良 提交于 2020-03-04 08:12:43
反射:框架设计的灵魂 反射:将类的各个组成部分封装为其他对象,这就是反射机制 好处 1.可以在程序运行过程中,操作这些对象。 2.可以解耦,提高程序的可扩展性。 类加载器是将.class文件加载进内存 Class对象功能: * 获取功能: 1. 获取成员变量们 * Field [ ] getFields ( ) :获取所有 public 修饰的成员变量 * Field getField ( String name ) 获取指定名称的 public 修饰的成员变量 * Field [ ] getDeclaredFields ( ) 获取所有的成员变量,不考虑修饰符,反射获取成员变量不受修饰符限制。 * Field getDeclaredField ( String name ) 2. 获取构造方法们 * Constructor < ? > [ ] getConstructors ( ) * Constructor < T > getConstructor ( 类 < ? > . . . parameterTypes ) * Constructor < T > getDeclaredConstructor ( 类 < ? > . . . parameterTypes ) * Constructor < ? > [ ] getDeclaredConstructors ( ) 3.

Java编程的逻辑 (84) - 反射

青春壹個敷衍的年華 提交于 2020-03-01 19:13:02
上节介绍完了并发,从本节开始,我们来探讨Java中的一些动态特性,包括反射、类加载器、注解和动态代理等。利用这些特性,可以以优雅的方式实现一些灵活和通用的功能,经常用于各种框架、库和系统程序中,比如: 在63节介绍的实用序列化库Jackson,利用反射和注解实现了通用的序列化/反序列化机制 有多种库如Spring MVC, Jersey用于处理Web请求,利用反射和注解,能方便的将用户的请求参数和内容转换为Java对象,将Java对象转变为响应内容 有多种库如Spring, Guice利用这些特性实现了对象管理容器,方便程序员管理对象的生命周期以及其中复杂的依赖关系 应用服务器比如Tomcat利用类加载器实现不同应用之间的隔离、JSP技术也利用类加载器实现修改代码不用重启就能生效的特性 面向方面的编程(AOP - Aspect Oriented Programming)将编程中通用的关注点比如日志记录、安全检查等与业务的主体逻辑相分离,减少冗余代码,提高程序的可维护性,AOP需要依赖上面的这些特性来实现 本节先来看反射机制。 在一般操作数据的时候,我们都是知道并且依赖于数据的类型的,比如: 根据类型使用new创建对象 根据类型定义变量,类型可能是基本类型、类、接口或数组 将特定类型的对象传递给方法 根据类型访问对象的属性,调用对象的方法 编译器也是根据类型,进行代码的检查编译。

PHP反射机制实现插件的可插拔设计

放肆的年华 提交于 2020-02-29 17:22:39
说PHP和ASP等同的朋友们可以就此打住了,PHP支持反射,而且还是非常的强大。好了,我们开始今天的话题。 功能描述: 页面拥有一个主导航菜单,里头有默认连接若干。 插件统一存放在一个目录,插件载入后会自动在导航菜单中增加上自己所需的链接。 插件载入时可执行一定的操作。 动态增删插件无需改动代码。 最终效果: 首页,插件1,插件2 “首页”是系统自带的菜单项。“插件1”和“插件2”是由插件注册的菜单项。 实现过程: 1. 文件结构 Learn plugin plugin1.php plugin2.php test.php 如此设计后,页面入口为test.php,插件都存放在plugin目录下,只要遍历plugin目录就可以找到所有的插件了。 2. 设计插件接口 interface IPlugin{ static function getname(); static function init(); static function getMenu(); } 3. 插件内部实现接口 Plugin1实现接口:<?php Class Welcome implements IPlugin{ static function getname(){ return ‘Welcome (Plugin)’; }static function getMenu(){ return array( ‘text’

架构实现利器:反射

余生颓废 提交于 2020-02-29 10:32:28
版权声明:本文由韩伟原创文章,转载请注明出处: 文章原文链接: https://www.qcloud.com/community/article/246 来源:腾云阁 https://www.qcloud.com/community 作者介绍:韩伟,1999年大学实习期加入初创期的网易,成为第30号员工,8年间从程序员开始,历任项目经理、产品总监。2007年后创业4年,开发过视频直播社区,及多款页游产品。2011年后就职于腾讯游戏研发部公共技术中心架构规划组,专注于通用游戏技术底层的研发。 通用型软件框架的难题 假设我们希望开发一套通用型的软件框架,这个框架允许用户自定义大量不同的情况下的回调函数(方法),用来实现丰富多彩的业务逻辑功能,例如一个游戏脚本引擎,那么,其中一个实现方式,就是使用观察者模式,以事件的方式来驱动整个框架。用户通过定义各个事件的响应函数,来组织和实现业务逻辑。而框架也提供了自定义事件及其响应函数的入口。在一些实现代码中,我们可能会发现有大量的“注册事件”的代码,或者是使用一个巨大的switch…case…对事件函数进行分发调用。譬如我们想做一个服务器端的基本进程框架,这个框架让用户只需要填写一些回调函数,就能成为一个稳定持续运行的后台服务进程。其中一个部分,就是需要定义程序启动事件,以便用户自定义程序启动要做的事情。那么我们可以定义一个”Init

java反射与代理

馋奶兔 提交于 2020-02-29 07:52:21
Java反射机制与动态代理,使得Java更加强大,Spring核心概念IoC、AOP就是通过反射机制与动态代理实现的。 1 Java反射 示例: User user = new User(); user.setTime5Flag("test"); Class<?> cls = Class.forName("com.test.User"); //接口必须public,无论是否在本类内部使用!或者使用cls.getDeclaredMethod(),或者遍历修改可访问性 Method method = cls.getMethod("getTime5Flag"); String res1 = (String) method.invoke(user); System.out.println(res1); //涉及到基本类型如int,则使用int.class!Integer.class!=int.class! method = cls.getMethod("setTime5Flag", String.class); method.invoke(user, "Rollen"); method = cls.getMethod("getTime5Flag"); String res2 = (String) method.invoke(user); System.out.println(res2);

(三)java高级1

↘锁芯ラ 提交于 2020-02-28 19:40:10
分享以一下最近学习java的网站是:https://how2j.cn/k/reflection/reflection-usage/1111.html?p=131627 这篇文章也是根据网站的来学习。 一、关于反射机制 1.先要了解的概念 1.1.类对象概念 所有的类,都存在一个类对象,这个类对象用于提供类本身的信息,比如有几种构造方法, 有多少属性,有哪些普通方法。 类:有定义好的属性、方法的,可以完成一定功能的class 对象:类实例化,就是给类中的属性赋值,在内存中开辟一个这个类的实际的存在; 类对象:用来描述这种类,都有什么属性,什么方法的(不关对象的事情,不是实例化的) 1.2如何获取类对象 有三种,比如Hero是我们创建好的一个类 Class.forName(“package.Hero”) Hero.class New Hero.getClass() 2.反射机制 2.1 使用反射机制获取对象 与传统的通过new 来获取对象的方式不同 反射机制,会先拿到Hero的“类对象”,然后通过类对象获取“构造器对象” 再通过构造器对象创建一个对象 package reflection; import java.lang.reflect.Constructor; import charactor.Hero; public class TestReflection { public

类加载机制与反射

☆樱花仙子☆ 提交于 2020-02-27 02:43:40
1、类的加载、连接和初始化 加载类的时机 第一次使用该类 采用预加载机制加载类 Java虚拟机进程(JVM进程) 同一个JVM里的所有线程、所有变量都处于同一个进程里,都使用该JVM进程的内存区 JVM进程终止时机 程序运行到最后正常结束。 程序运行到使用System.exit()或Runtime.getRuntime().exit()代码处结束程序。 程序执行过程中遇到未捕捉的异常或错误而结束。 程序所在平台强行结束了JVM进程。 两个JVM进程间并不会共享数据 类的加载 加载、连接、初始化(当程序使用某个类时,如果该类还未加载进内存中,执行这三个步骤来对类进行初始化。)(这三个步骤通常连续完成,故统称为类加载、类初始化) 类加载:将类的class文件读入内存,并为之创建一个java.lang.Class对象。 类的加载由类加载器完成,类加载器通常由JVM提供,这些类加载器也是java程序运行的基础,JVM提供的这些类加载器通常被称为系统类加载器。 开发者可以通过继承ClassLoader基类来创建自己的类加载器。 通过使用不同的类加载器,可以从不同来源加载类的二进制数据 从本地文件系统加载class文件 从JAR包加载class文件 通过网络加载class文件 把一个java源文件动态编译,并执行加载 类加载器通常无需等到“首次使用”该类时才加载该类

06 面向对象之:反射,双下方法

旧城冷巷雨未停 提交于 2020-02-26 21:39:18
一. 反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力(自省)。这一概念的提出很快引发了计算机科学领域关于应用反射性的研究。它首先被程序语言的设计领域所采用,并在Lisp和面向对象方面取得了成绩。 python面向对象中的反射:通过字符串的形式操作对象相关的属性。python中的一切事物都是对象(都可以使用反射) 四个可以实现自省的函数 下列方法适用于类和对象(一切皆对象,类本身也是一个对象) class Foo: f = '类的静态变量' def __init__(self,name,age): self.name=name self.age=age def say_hi(self): print('hi,%s'%self.name) obj=Foo('egon',73) #检测是否含有某属性 print(hasattr(obj,'name')) print(hasattr(obj,'say_hi')) #获取属性 n=getattr(obj,'name') print(n) func=getattr(obj,'say_hi') func() print(getattr(obj,'aaaaaaaa','不存在啊')) #报错 #设置属性 setattr(obj,'sb',True) setattr(obj,'show

您可以使用反射找到包中的所有类吗?

大城市里の小女人 提交于 2020-02-26 16:37:37
是否可以在给定的包中找到所有类或接口? (快速查看例如 Package ,似乎没有。) #1楼 我整理了一个简单的github项目来解决这个问题: https://github.com/ddopson/java-class-enumerator 它应同时适用于基于文件的类路径和jar文件。 如果您在签出项目后运行“ make”,它将打印出来: Cleaning... rm -rf build/ Building... javac -d build/classes src/pro/ddopson/ClassEnumerator.java src/test/ClassIShouldFindOne.java src/test/ClassIShouldFindTwo.java src/test/subpkg/ClassIShouldFindThree.java src/test/TestClassEnumeration.java Making JAR Files... jar cf build/ClassEnumerator_test.jar -C build/classes/ . jar cf build/ClassEnumerator.jar -C build/classes/ pro Running Filesystem Classpath Test... java

JAVA中的反射机制

血红的双手。 提交于 2020-02-26 12:02:17
JAVA中的反射机制 文章目录 JAVA中的反射机制 反射机制-获取类对象 什么是类对象? 如何获取类对象 反射机制-创建对象 创建一个对象 通过配置文件创建获取文件 反射机制- 访问属性 通过反射机制来访问和修改对象的属性 反射机制- 调用方法 调用方法 反射机制- 有什么用处 反射机制-获取类对象 什么是类对象? 所有的类,都有一个类对象,这个类对象用于提供类本身的信息。比如有多少构造方法,有多少属性,有哪些普通方法。 如何获取类对象 获取类对象有3种方式 Class.forName 类名.class new 类名.getClass() 在JVM中,一种类只会有一个类对象存在,所以以上三种方式所获取的类对象,都是一样的。 准确的来讲,是一个 ClassLoader 下,一种类只有一个类对象存在 代码实现: package reflection ; /** * @author xsl20 */ public class GetInstanceForClass { public static void main ( String [ ] args ) { String className = "reflection.Hero" ; try { Class pClass1 = Class . forName ( className ) ; Class pClass2 = Hero .