反射

Java反射指南

戏子无情 提交于 2020-04-13 06:08:07
前言 Java反射机制可以让我们在编译期(Compile Time)之外的运行期(Runtime)检查类,接口,变量以及方法的信息。反射还可以让我们在运行期实例化对象,调用方法,通过调用get/set方法获取变量的值。 Java反射机制功能强大而且非常实用。举个例子,你可以用反射机制把Java对象映射到数据库表,就像 Butterfly Persistence 所做的那样,或者把脚本中的一段语句在运行期映射到相应的对象调用方法上,就像 Butterfly Container 在解析它的配置脚本时所做的那样。 目前在互联网上已经有不胜枚举的Java反射指南,然而大多数的指南包括Sun公司所发布的反射指南中都仅仅只是介绍了一些反射的表面内容以及它的潜能。 在这个系列的文章中,我们会比其他指南更深入的去理解Java反射机制,它会阐述Java反射机制的基本原理包括如何去使用数组,注解,泛型以及动态代理还有类的动态加载以及类的重载的实现。同时也会向你展示如何实现一些比较有特性的功能,比如从一个类中读取所有的get/set方法,或者访问一个类的私有变量以及私有方法。在这个系列的指南中同时也会说明一些非反射相关的但是令人困惑的问题,比如哪些泛型信息在运行时是有效的,一些人声称所有的泛型信息在运行期都会消失,其实这是不对的。 改系列文章中所描述介绍的是Java 6版本的反射机制。

java基础-反射技术(磨砺营马剑威java)

不羁的心 提交于 2020-04-09 22:15:28
​ 在Java运行时环境中,对于任意一个类,能否知道这个类的哪些属性和方法?对于任意一个对象,能否调用它的任意一个方法?答案是肯定的。这种动态获取类的信息以及动态调用对象的方法的功能来自于Java语言的反射(Reflection)机制。 反射给java提供了,运行时获取一个类实例的可能,这一点非常灵活,你仅仅传一个类的全限定名,就能通过反射,来获取对应的类实例,我们一般会用Class类,来调用这个被反射的Objcet类下的:构造方法,属性,或方法等。 反射在一些开源框架里用的非常之多,Spring,Struts,Hibnerate,MyBatics都有它的影子,反射虽然很灵活,能够使得写的代码,变的大幅精简,所以在用的时候,一定要注意具体的应用场景。 反射的优缺点如下: 优点: A:能够运行时动态获取类的实例,大大提高系统的灵活性和扩展性。 B:与Java动态编译相结合,可以实现无比强大的功能 缺点: A:使用反射的性能较低 B:使用反射相对来说不安全 C:破坏了类的封装性,可以通过反射获取这个类的私有方法和属性 任何事物,都有两面性,反射的优点,也同是就是它的缺点,所以,没有好与坏,只有最合适的场景,一阴一阳,才是天道平衡的条件。 在反射API中我们重点关注一下几个类: Class -- 代表类 Field -- 代表属性(成员变量) Method -- 代表方法

代理模式&动态代理

折月煮酒 提交于 2020-03-02 08:20:10
动态代理的用途: 动态代理的用途与装饰模式很相似,就是为了对某个对象进行增强。所有使用装饰者模式的案例都可以使用动态代理来替换,动态代理可以更好的解耦合 增强有3个手段 1. 继承 被增强对象不能变 增强内容不能变 2. 装饰者模式 被增强对象可变 但增强内容不能变 3. 动态代理 被增强对象可变 增强内容也可变 如何实现动态代理? 定义一个接口Interface, 被增强的对象的类都会实现这个接口 public interface Interface { public void fun(); } 实现这个Interface接口: 而这个InterfaceImpl就是动态代理中被增强的内容 public class InterfaceImpl implements Interface { @Override public void fun() { System.out.println("目标方法调用"); } } 定义一个接口Advice, 增强内容的类都会实现这个接口 这个接口有两个未实现的方法: before()前置增强的方法 after()后置增强的方法 public interface Advice { public void before(); public void after(); } 而实现了Advice接口的对象就是动态代理中增强内容 JavaAPI: java

吃透Java的反射机制——基础知识总结

こ雲淡風輕ζ 提交于 2020-03-02 06:47:04
一、什么是Java的反射 大家都知道,要让Java程序能够运行,那么就得让Java类要被Java虚拟机加载。Java类如果不被Java虚拟机加载,是不能正常运行的。现在我们运行的所有的程序都是在编译期的时候就已经知道了你所需要的那个类的已经被加载了。 Java的反射机制是在编译并不确定是哪个类被加载了,而是在程序运行的时候才加载、探知、自审。使用在编译期并不知道的类。这样的特点就是反射。 二、反射机制的作用 在Java运行时环境中,对于任意一个类,可以知道这个类有哪些属性和方法。对于任意一个对象,可以调用它的任意一个方法。这种动态获取类的信息以及动态调用对象的方法的功能来自于Java 语言的反射(Reflection)机制。简单的来说,反射机制指的是程序在运行时能够获取自身的信息。在java中,只要给定类的名字,那么就可以通过反射机制来获得类的所有信息。 三、哪里用到反射机制 有些时候,我们用过一些知识,但是并不知道它的专业术语是什么,在刚刚学jdbc时用过一行代码,Class.forName("com.mysql.jdbc.Driver.class").newInstance();但是那时候只知道那行代码是生成驱动对象实例,并不知道它的具体含义。听了反射机制这节课后,才知道,原来这就是反射,现在很多开框架都用到反射机制,hibernate、struts都是用反射机制实现的。

PHP debug_backtrace的胡思乱想

时间秒杀一切 提交于 2020-03-01 14:24:27
本文示例代码测试环境是Windows下的APMServ(PHP5.2.6) 简述 可能大家都知道,php中有一个函数叫 debug_backtrace ,它可以 回溯跟踪函数的调用信息,可以说是一个调试利器。 好,来复习一下。 one(); function one() { two(); } function two() { three(); } function three() { print_r( debug_backtrace() ); } /* 输出: Array ( [0] => Array ( [file] => D:\apmserv\www\htdocs\test\debug\index.php [line] => 10 [function] => three [args] => Array ( ) ) [1] => Array ( [file] => D:\apmserv\www\htdocs\test\debug\index.php [line] => 6 [function] => two [args] => Array ( ) ) [2] => Array ( [file] => D:\apmserv\www\htdocs\test\debug\index.php [line] => 3 [function] => one [args] => Array (

翻译11 Unity 透明渲染

空扰寡人 提交于 2020-02-23 20:15:14
溶解/挖孔 渲染队列 半透明材质 合并反射和半透明 Unity 5.6.6f2 1.1 如何抠掉轮廓外区域(不显示)? Unity渲染顺序 所有不透明物体优先渲染,同时开启深度测试和深度写入。 带有透明效果的物体根据摄像机距离远近,从后(远)往前(近)渲染,并开启深度测试关闭深度写入 Unity渲染模式:RenderMode Opaque - 默认, 适用于所有没有透明区域的固体物体. Cutout - 创建透明效果(挖孔掏边效果),但该效果在不透明和透明之间过渡具有硬边。 在此模式下,没有半透明区域。 当使用Cutout来创建任何带孔效果(树叶或带有孔和破烂物的布料)。 Transparent - 适用于渲染逼真的透明材料,例如透明塑料或玻璃。 材质本身将具有透明度值(基于纹理的Alpha通道和色调的Alpha),反射和照明高光将保持完全清晰可见。 Fade - 允许透明度值完全淡出对象,包括对象可能具有的任何镜面反射高光或反射。 如果要对淡入或淡出的对象设置动画,此模式很有用。 它不适合渲染逼真的透明材料,因为反射和高光也会由淡出效果。 队列RenderOrder :“Queue”=”Geometry”或“Queue”=”Geometry±1”。指示物体所在的渲染顺序层级 Background -1000 最先渲染。通常是地面 Geometry (default) – 2000

反射

邮差的信 提交于 2020-02-07 19:55:03
反射的概念及演示 1).什么是“反射”:它是Java提供的一种技术,这种技术可以让我们任意的加载某个类,并创建它的对象,甚至不用知道这个类的名字、以及内部结构。 2).“反射”的作用:可以解开“类与类之间的耦合关系”。 运行时class文件的加载 1).当我们的程序第一次创建某个类的对象时,会去找它的class文件;如果在本次运行过程中,再创建此类对象,就不会再去找class文件了。 注意:JVM在运行时,为任何的类,都会在“方法区”中创建它的Class对象,而且每个类,只创建一个”Class对象”。 获取Class对象的三种方式 1).getClass()方法 2).类名.class 3).Class.forName(“全类名”);【常用】 示例代码: public static void main ( String [ ] args ) throws ClassNotFoundException { //1.getClass()方法获取此类的Class对象 Student stu1 = new Student ( ) ; //创建Class对象 Class c1 = stu1 . getClass ( ) ; //2.类名.class Class c2 = Student . class ; //如果没有Class,会创建Class对象;如果有,就直接获取 //3.Class

这一顿神操作!我把 3000 行代码重构成 15 行!

。_饼干妹妹 提交于 2020-02-06 13:05:04
作者:马非码 博客园:https://www.cnblogs.com/marvin/p/4133973.html 如果你认为这是一个标题党,那么我真诚的恳请你耐心的把文章的第一部分读完,然后再下结论。如果你认为能够戳中您的 G 点,那么请随手点个赞。 把三千行代码重构为 15 行 那年我刚毕业,进了现在这个公司。公司是搞数据中心环境监控的,里面充斥着嵌入式、精密空调、总线、RFID的概念,我一个都不懂。还好,公司之前用Delphi写的老客户端因为太慢,然后就搞了个Webform的替代,恰好我对Asp.Net还算了解,我对业务的不了解并不妨碍我称成为这个公司的一个程序员。小公司也有小公司的好,人少,进去很快负责代码开发。我当然也就搞这个数据中心智能管理系统啦。 这个系统非常的庞大,尤其牛逼的是支持客户端组态,然后动态生成网页,数据还能通过Socket实时监控(那时我还真就不懂网络编程)。这个对于当时的我来说,真真是高、大、上呐!!当时跟着了解整个系统大半个月才算能够调试,写一些简单的页面。 在维护系统的过程中,时不时要扩展一些功能,也就接触了下面这个类: 看到没有,就是当年最最流行的三层架构的产物,对于刚出茅庐的毛头小子来说,这是多么专业的文件头注释,还有反射也就算了,这构造函数还能静态的,还能私有的?那时刚接触这么高大上的代码的我,瞬间给跪了! 但是,类写多了,我就感觉越来越别扭

JAVA CLASS类的初步认识与基本用法

僤鯓⒐⒋嵵緔 提交于 2020-01-10 10:28:45
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 首先咱们先来说下这个类在JAVA里充当类什么角色: 首先这个类跟Objct是没关系的,但是他的对象却全部有关系; 相当于玩游戏里的外挂 相当于打外国游戏时你买的代理 相当于你美国的特工 以上这几个比较适用初学者初步对CLASS这个类的理解 总之这个类就是充当强盗的角色,强取豪夺别人东西; 接下来写个例子,结合我这几句解释相信每个初学者就能知道到底什么是CLASS了 package exp class A{ private int i=0; private A(int i){ this.i=i; } private void f(){ System.out.print(i+""); } } 像上面写的这个类,要是在我们以前,除非用单实例模式来使用它,也就是在写的时候要主动添加几个方法进去让别人去使用它,不然就没法使用了; 但是有了CLASS这个强盗之后,妈妈再也不用担心我使用不了那个类了。 记得用全部私有的类来测试自己,就像我上面写的一样,像其他人写公有的来测试有时候会错得自己都不知道已经错了 接下来一起看看怎么用CLASS来使用吧: 下面是几个最基本的用法 public class B{ public static void main (String[] args){ Class cl=Class

反射

隐身守侯 提交于 2019-12-23 04:46:22
思考:在讲反射之前,先思考一个问题,java中如何创建一个对象,有哪几种方式? Java中创建对象大概有这几种方式: 1、使用new关键字:这是我们最常见的也是最简单的创建对象的方式 2、使用Clone的方法:无论何时我们调用一个对象的clone方法,JVM就会创建一个新的对象,将前面的对象的内容全部拷贝进去 3、使用反序列化:当我们序列化和反序列化一个对象,JVM会给我们创建一个单独的对象 上边是Java中常见的创建对象的三种方式,其实除了上边的三种还有另外一种方式,就是接下来我们要讨论的 “反射” 一、什么是反射? 1.1、概念 在运行状态中,对于任意一个类,都能够获取到这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意一个方法和属性(包括私有的方法和属性),这种动态获取的信息以及动态调用对象的方法的功能就称为java语言的反射机制。通俗点讲,通过反射,该类对我们来说是完全透明的,想要获取任何东西都可以。 想要使用反射机制,就必须要先获取到该类的字节码文件对象(.class),通过字节码文件对象,就能够通过该类中的方法获取到我们想要的所有信息(方法,属性,类名,父类名,实现的所有接口等等),每一个类对应着一个字节码文件也就对应着一个Class类型的对象,也就是字节码文件对象。 反射就是把Java类中的各种成分,映射成一个个的java对象,拿到这些对象后可以做一些事情。