反射机制

Java反射机制--是什么,为什么,怎么用。

≡放荡痞女 提交于 2020-04-03 10:34:27
  往往当我们面对一项新的知识时,我们往往需要知道三个方面,它是什么,它能做什么,它比原有知识强在哪里,我们该怎么使用它。当你能够解决这些问题时,便意味着你已经对这项知识入门了。 一、是什么   Java Reflaction in Action有这么一句话,可以解释。反射是运行中的程序检查自己和软件运行环境的能力,它可以根据它发现的进行改变。通俗的讲就是反射可以在运行时根据指定的类名获得类的信息。 二、为什么   我们为什么要使用反射,它的作用是什么,它在实际的编程中有什么应用。   首先我们先明确两个概念,静态编译和动态编译。   静态编译:在编译时确定类型,绑定对象,即通过。   动态编译:运行时确定类型,绑定对象。动态编译最大限度发挥了java的灵活性,体现了多   态的应用,有以降低类之间的藕合性。   我们可以明确的看出动态编译的好处,而反射就是运用了动态编译创建对象。   那么我们再来看看实际中反射又有什么好处那?   往往对比能更加直观的向我们展示两者的不同。   先从某个代码案例上来解释(套用一篇博文的一个例子:http://blog.csdn.net/justdoit_potato/article/details/51011843)   若是不用反射,它是这样的 interface fruit{ public abstract void eat(); }

Python面向对象反射,双下方法

情到浓时终转凉″ 提交于 2020-04-02 23:30:34
一. 反射 反射的概念是由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

Java基础增强-反射机制

六眼飞鱼酱① 提交于 2020-04-02 19:26:56
1 反射机制简介 Java的反射(reflection)机制是指在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用任意一个对象的属性和方法。这种动态获取程序信息以及动态调用对象的功能称为Java语言的反射机制。反射被视为动态语言的关键。 反射这一概念最早由编程开发人员Smith在1982年提出,主要指应用程序访问、检测、修改自身状态与行为的能力。这一概念的提出立刻吸引了编程界的极大关注,各种研究工作随之展开,随之而来引发编程革命,出现了多种支持反射机制的面向对象语言。 在计算机科学领域,反射是指一类能够自我描述和自控制的应用。在Java编程语言中,反射是一种强有力的工具,是面向抽象编程一种实现方式,它能使代码语句更加灵活,极大提高代码的运行时装配能力。 2 Class类 对于一个字节码文件.class,虽然表面上我们对该字节码文件一无所知,但该文件本身却记录了许多信息。Java在将.class字节码文件载入时,JVM将产生一个java.lang.Class对象代表该.class字节码文件,从该Class对象中可以获得类的许多基本信息,这就是反射机制。所以要想完成反射操作,就必须首先认识Class类。 [1] 反射机制所需的类主要有java.lang包中的Class类和java.lang

java反射详解

六月ゝ 毕业季﹏ 提交于 2020-04-01 09:03:03
1.什么是反射 反射是一种间接操作目标对象的机制,在程序程序运行时(动态)获取或者设置对象自身的信息。 只要给定类的名字,就可以通过反射获取类的所有信息,接着便能调用它的任何一个方法和属性。 Java反射就是在运行状态中,对于任意一个类,只要知道类名,就能够得到或者知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;并且能改变它的属性。而这也是Java被视为动态(或准动态,为啥要说是准动态,因为一般而言的动态语言定义是程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言。从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C#不是动态语言。)语言的一个关键性质。 2.反射机制的作用 1 )在运行时判断任意一个对象所属的类。(通过 对象.getclass() 可以知道该对象是属于哪个类的) 2 )在运行时判断任意一个类所具有的成员变量和方法。( 类对象.get...方法) 3 )在运行时任意调用一个对象的方法( 对象) 4 )在运行时构造任意一个类的对象 3.反射的步骤 1 //1、通过对象调用 getClass() 方法来获取,通常应用在:比如你传过来一个 Object 2 // 类型的对象,而我不知道你具体是什么类,用这种方法 3   Person p1 = new Person(); 4   Class c1 = p1

8千字干货教程|java反射精讲

假如想象 提交于 2020-03-30 11:26:09
java反射机制精讲 目录 1. 反射机制的概念 2. 反射的基础Class类 3. 反射的用法 4. 反射的应用示例 作者简介:全栈学习笔记,一个正在努力的人 反射机制的概念: 在运行状态中,对于任意一个类,都能够获取到这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意一个方法和属性(包括私有的方法和属性),这种动态获取的信息以及动态调用对象的方法的功能就称为java语言的反射机制。反射被视为动态语言的关键。简单来说反射就是java的各种成分映射成对应的java类。 通俗点讲,通过反射,该类对我们来说是完全透明的,想要获取任何东西都可以。包括构造方法,属性,方法。 java反射机制提供的功能 : 在运行时判断任意一个对象所属的类; 在运行时构造任意一个类的对象; 在运行时判断任意一个类所具有的成员变量和方法; 在运行时调用任意一个对象的方法; 生成动态代理。 这其实也涉及到了语言的动态与静态,java语言本身不算是动态语言,但是他有一个非常突出的动态机制,就是我们所说的反射机制。 什么是动态语言呢?就是说,程序在运行的时候,(注意是运行的时候,不是编译的时候)允许改变程序结构或者变量类型。反之静态就是没有这些特点了。 反射的基础Class类 Class类是反射实现的基础,所以想要学会反射,必须先掌握Class类的一些基本的概念。 类是什么?类是Class类的实例对象

Java-通过反射越过泛型检查

烈酒焚心 提交于 2020-03-29 11:00:09
一、需求描述 现有一个ArrayList array= new ArrayList ();如何在array中添加String类型数据??? 二、思考 我们知道在集合类中一旦指定了泛型的类型,则只能在该集合中用该类型。但是我们可以利用反射机制来越过泛型检查。比如说利用反射机制获取ArrayList中的add()方法,再调用add方法时,就会越过泛型检查。通过反编译我们能看到这一现象。 现有如下代码,创建ArrayList时使用了泛型。 public class Test { public static void main(String[] args) throws Exception { ArrayList<Integer> array = new ArrayList<Integer>(); } } 利用反编译查看Class文件,就会发现此时创建ArrayList时并没有增加泛型。 这是因为泛型检查是在编译时期进行的,也就是说编译后的add()方法其实和没有指定泛型的add()方法是一致的,都是没有进行泛型检查的。 所以通过反射获取ArrayList的Class文件对象中的add()方法,在调用该add()方法时是不用泛型检查的。 三、需求实现 现在使用反射来实现这一需求。 代码如下: public class Test { public static void main

java基础之反射---重要

我的未来我决定 提交于 2020-03-28 08:41:18
java反射: 反射是框架设计的灵魂 (使用的前提条件:必须先得到代表的字节码的Class,Class类用于表示.class文件(字节码)); 1:获取Class字节码文件对象的三种方式: 2 /** 3 * 获取Class对象的三种方式 4 * 1 Object ——> getClass(); 5 * 2 任何数据类型(包括基本数据类型)都有一个“静态”的class属性 6 * 3 通过Class类的静态方法:forName(String className)(常用) 7 * 8 */ 9 public class Fanshe { 10 public static void main(String[] args) { 11 //第一种方式获取Class对象 12 Student stu1 = new Student();//这一new 产生一个Student对象,一个Class对象。 13 Class stuClass = stu1.getClass();//获取Class对象 14 System.out.println(stuClass.getName()); 15 16 //第二种方式获取Class对象 17 Class stuClass2 = Student.class; 18 System.out.println(stuClass == stuClass2);/

Java之反射机制

家住魔仙堡 提交于 2020-03-28 08:23:23
1. 概述 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。 2. 反射机制初探 首先我们做一下准备工作: package com.myreflex; public class Demo { private String str1; public String str2; private void fun1(){ System.out.println("You call fun1"); } public void fun2(){ System.out.println("You call fun2"); } public void fun3(int param1, String param2) { System.out.println("You call fun3 with param:"+param1+" and "+param2); } public Demo(int param1, String param2) { System.out.println("Consturctor with "+param1+","+param2); } public Demo() { System.out.println(

软件测试——java反射机制

不问归期 提交于 2020-03-28 08:23:09
软件测试中出现私有方法时,需要使用反射机制来实现代码的测试。 首先,简略说一下反射是什么~~https://www.cnblogs.com/zhaoguhong/p/6937364.html COPY——JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。 其次,代码~~ 被测试类: public class MSD { private static final int BITS_PER_BYTE = 8; private static final int BITS_PER_INT = 32; // each Java int is 32 bits private static final int R = 256; // extended ASCII alphabet size private static final int CUTOFF = 15; // cutoff to insertion sort // do not instantiate private MSD() { } //private MSD(int a) { } /** * Rearranges the array of extended ASCII

java反射机制

北城余情 提交于 2020-03-28 08:22:56
转自 http://blog.csdn.net/xiaoxian8023 Java 反射机制 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。 JAVA反射应用 Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类; 在运行时构造任意一个类的对象; 在运行时判断任意一个类所具有的成员变量和方法; 在运行时调用任意一个对象的方法; 生成动态代理。 常用方法 ①. 判断对象是否属于反射得到的类(isInstance) class S { } public class IsInstance { public static void main(String args[]) { try { Class cls = Class.forName("S"); boolean b1 = cls.isInstance(new Integer(37)); System.out.println(b1); boolean b2 = cls.isInstance(new S()); System.out.println(b2); } catch (Throwable e) { System.err.println(e); } } }