反射机制

什么是反射机制?

删除回忆录丶 提交于 2020-01-23 13:30:09
定义 反射机制是Java语言中一个非常重要的特性,它允许程序在运行时进行自我检查,同时也允许其对内部成员进行操作。由于反射机制能够实现在运行时对类进行装载,因此能够增加程序的灵活性,但是不恰当地使用反射机制,也会严重影响系统的性能。 具体而言,反射机制的主要功能主要有:①得到一个对象所属的类,②获取一个类的所有成员变量和方法,③在运行时创建对象,调用对象的方法。 反射机制的作用: 1,反编译:.class–>.java 2,通过反射机制访问java对象的属性,方法,构造方法等; 先看一下sun为我们提供了那些反射机制中的类: java.lang.Class; java.lang.reflect.Constructor; java.lang.reflect.Field; java.lang.reflect.Method; java.lang.reflect.Modifier; 很多反射中的方法,属性等操作我们可以从这四个类中查询。还是哪句话要学着不断的查询API,那才是我们最好的老师。 Class c=Class.forName(“Employee”); Object o=c.newInstance(); 调用了Employee的无参数构造方法 方法关键字 getDeclareMethods() 获得所有的方法 getReturnType() 获得方法的返回类型

自定义注解的场景及其实现

回眸只為那壹抹淺笑 提交于 2020-01-23 04:25:31
自定义注解的场景及其实现 自定义注解的场景 登陆、权限拦截、日志处理,以及各种Java框架,如Spring、Mybatis、Hibernate、JUnit 实现方法 Java自定义注解通过 运行期间靠反射获取注解 ,实际开发过程中,如果我们需要获取某个方法的调用日志,可以通过 AOP(动态代理机制) 对方法添加切面,通过反射获取方法包含的注解,如果包含了日志注解,就进行日志记录 Java反射实际是通过对Class对象进行操作而实现,Class对象为我们提供了一系列方法对类进行操作 在JVM角度上来说, Class文件 是 一组以8字节为基础单位的二进制流,各个数据项目按照严格的顺序紧凑的排列在一起 ,里面包含了类、方法、字段等有关数据, 通过对Class数据流进行相应的处理 ,就可以得到相应的字段、方法、类等数据。 来源: CSDN 作者: 量子计算机牛逼 链接: https://blog.csdn.net/qq_41877948/article/details/103991100

动态代理设计模式,及实现原理

こ雲淡風輕ζ 提交于 2020-01-22 23:58:29
动态代理模式,前提还是代理模式,只是优化了静态代理的一些不足。 比如,静态代理在一对一关系出现时,创建的代理对象较多,代码量也大,可维护性就会稍差,在一对多的代理关系出现是,可扩展性就更差了。 而动态代理,就是在使用时,才去创建代理类和实例,这样就可以通过一个动态代理类解决创建多个静态代理的问题,更灵活了。 当然动态代理的缺点也是有的,就是相比静态代理直接调用目标对象方法,动态代理效率会低,因为它是通过反射机制,间接调用目标方法的。 所以,在讨论动态代理前,需要先说说静态代理,及反射。 先说反射,通常对一个类对象执行操作时,都要先知道它是什么类,是做什么的,然后去实例化 对象进行操作。 但是,反射则是一开始不知道要初始化的类是什么,无法使用new关键字来创建对象。而是在运行时才知道要操作的类是什么,可以在运行时获取类的完整构造,并调用对应的方法,访问属性。 那反射跟运行时类信息(RTTI)有什么区别呢? 运行时类型识别(Run-Time Type Identification),使得可以在程序运行时发现和使用类型信息。 Java有两种方式可以让我们在运行时识别对象和类的信息,一种是RTTI,它假定在编译时已经知道了所有的类型;另一种就是反射,允许在运行时发现和使用类信息。 RTTI的基本使用 package rtti; import java.util.Arrays; import

反射机制——(2) 获取Class中的构造函数

我是研究僧i 提交于 2020-01-22 19:07:34
一、创建对象 追根溯源 //早期:new时候,先根据被new的类的名称找寻该类的字节码文件,并加载进内存, //并创建该字节码文件对象,并接着创建该字节文件的对应的Person对象. //com.study.reflection.Person person=new com.study.reflection.Person(); 现在: //现在: String name = "cn.itcast.bean.Person"; //找寻该名称类文件,并加载进内存,并产生Class对象。 Class clazz = Class.forName(name); 如何产生对象? 在1.6API中 java.lang包中有个Clss类,类中有个方法,用于创建对象,返回一个泛型。 T newInstance () 创建此 Class 对象所表示的类的一个新实例。 Object obj = clazz.newInstance(); 查看一下newInstance( )方法 其实还是和new Object( ) 空参构造函数一样。需要调用空参构造函数。 com.study.reflection.Person person=new com.study.reflection.Person(); //现在: String name = "com.study.reflection.Person"; /

手写Spring之DI依赖注入

混江龙づ霸主 提交于 2020-01-22 05:44:27
之前写过了spring的IOC实现方式,现在则写DI依赖注入的实现方式 贴类图 由于在实现完DI进行测试的时候,会用到junit包,所以在pom.xml导入依赖 < ! -- SpringDI -- > < dependency > < groupId > junit < / groupId > < artifactId > junit < / artifactId > < version > 4.13 - beta - 3 < / version > < scope > compile < / scope > < / dependency > 接下来开始写,先创建几个需要的注解 package com . spring . DI . annotation ; import java . lang . annotation . ElementType ; import java . lang . annotation . Retention ; import java . lang . annotation . RetentionPolicy ; import java . lang . annotation . Target ; @Target ( ElementType . FIELD ) @Retention ( RetentionPolicy . RUNTIME )

Java中的反射

旧街凉风 提交于 2020-01-22 01:54:10
Java反射机制 一、什么是反射,为什么被推崇 JAVA反射机制:在运行状态中,对于任意一个实体类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。 作用:正常是知道类才能去创建对象,而现在 既可以用类来获取对象,又可以通过对象获取类的信息。简单来说就是 不用new 了。 实现方式:获取某类对应的Class对象,并通过Class对象使用该类中的构造器、属性、方法、内部类。 这里提供一个类,下面所有例子都是由此类推衍 package test; public class MyTest{ //成员变量 private int x; private String y; //构造器 public MyTest(int i){ System.out.println(i); } public MyTest(int i,String str){ System.out.println(i+str); } //成员方法 public int getX() { return x; } public void setX(int x) { this.x = x; } public String getY() { return y; } public void setY(String y) { this

整理几个概念:反射、序列化

牧云@^-^@ 提交于 2020-01-21 14:00:18
反射 一、什么是反射机制 反射是指程序可以访问、检测和修改它本身的状态或行为的一种能力。 二、哪里用到反射机制 有些时候,我们用过一些知识,但是并不知道它的专业术语是什么,在刚刚学jdbc时用过一行代码,Class.forName("com.mysql.jdbc.Driver.class").newInstance();但是那时候只知道那行代码是生成驱动对象实例,并不知道它的具体含义。看过反射后才知道,原来这就是反射,现在很多开源框架都用到反射机制,hibernate、struts都是用反射机制实现的。 三、反射机制的优点与缺点 为什么要用反射机制?直接创建对象不就可以了吗,这就涉及到了动态与静态的概念,静态编译:在编译时确定类型,绑定对象,即通过。动态编译:运行时确定类型,绑定对象。动态编译最大限度发挥了java的灵活性,体现了多态的应用,有以降低类之间的藕合性。 一句话,反射机制的优点就是可以实现动态创建对象和编译,体现出很大的灵活性,特别是在J2EE的开发中它的灵活性就表现的十分明显。 比如,一个大型的软件,不可能一次就把把它设计的很完美,当这个程序编译后,发布了,当发现需要更新某些功能时,我们不可能要用户把以前的卸载,再重新安装新的版本,假如这样的话,这个软件肯定是没有多少人用的。采用静态的话,需要把整个程序重新编译一次才可以实现功能的更新,而采用反射机制的话

非反射不转换类型地动态Property赋值、取值。

落花浮王杯 提交于 2020-01-20 14:54:09
适用情况: 为一个不确定的对象动态地为某一个未知的Property或多个 Property 赋值和取值 亮点: 非 Property.GetValue或 Property.SetValue ,使用委托代理缓存机制。 因此可以这样用: //假设是一个一个Entity对象var instance = new Topic();//得到其Property Dictionaryvar propDic = new InstancePropertyDictionary(instance);//无需转换为Object地赋值propDic.SetValue("属性名称",Int32值或Stirng值...);//不存在类型转换地取值Int32 int32Value = propDic.GetInt32("属性名称");string stringValue = propDic.GetString("属性名称"); 以下是全部实现的代码,单类,可直接使用: using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Reflection;namespace Lx{ /// <summary> /// Instance的属性高速读/写(无需转换类型)字典 /// <

注解和反射知识总结

混江龙づ霸主 提交于 2020-01-19 17:43:13
注解 Java.Annotation 1、注解入门 什么是注解? Annotation是从JDK5.0以后引入的新技术 Annotation的作用 不是程序本身,可以对程序作出解释(这一点和注解(comment)没什么区别) 可以被其他程序(比如:编译器)读取 Annotation的格式: 注解是以“@注释名”在代码中存在的,还可以添加一些参数值,例如:@SuppressWarnings(value="unchecked") Annotation在哪里使用? 可以附加在package,class,method,field等上面,相当于给他们添加了额外的辅助信息,我们可以通过反射机制编程实现对这些元数据的访问 测试代码: package pers.mobian.annotationreflex; public class TestAnnotationReflex { //此处的标记,即为注解 @Override public String toString() { return super.toString(); } } 2、内置注解 @Override:定义在java.lang.Override中,此注释只适用于修辞方法,表示一个方法声明打算重写超类中的另一个方法声明 @Deprecated:定义在java.lang.Deprecated中,此注释可以用于修饰方法,属性,类

java之测试、反射和注解

若如初见. 提交于 2020-01-19 05:22:34
一、测试 测试分类: 黑盒测试:不需要写代码,给输入值,看程序是否能输出期望值 白盒测试:写代码测试,关注程序具体执行流程 Junit:白盒测试 1.定义一个测试类 2.定义测试方法:可以独立运行 3.给方法添加@Test注解 4.导入Junit依赖环境 判定结果:红色代表失败,绿色代表成功 补充:(无论运行结果是正确还是错误,被修饰的方法都会执行) @Before:修饰分方法会在测试方法执行之前被自动执行 @After:修饰的方法会在测试方法执行之后自动执行 public class CalculateTest { @Test public void testAdd(){ Calculate c = new Calculate(); System.out.println("calculate..."); int result = c.add(1,2); //断言,我断言这个结果是三 // Assert.assertEquals(2,result); Assert.assertEquals(3,result); } //初始化方法,用于资源的申请 @Before public void init(){ System.out.println("init..."); } //结束方法,用于资源的释放 @After public void close(){ System.out