反射机制

Java反射机制

 ̄綄美尐妖づ 提交于 2020-01-13 04:36:05
一切的操作都将使用Object完成,类,数组的引用都可以使用Object来接收 1,认识Class类 以前要是想知道一个类中的属性,成员变量,方法等等的信息的话,需要通过new这个类的对象才能得到这些信息,但是在Java中,也允许一个实例化对象找到一个类的完整的信息,这个类就是Class类,Class类是继承Object类的. 正常方式: 引入需要的"包.类"名称 -->通过new实例化-->取得实例化对象 反射方式: 实例化对象-->getClass()方法(从Object类中继承而来),这里是得到Class类对象-->得到完整的"包.类"名称 getClass()这个方法的返回值是Class类,实际上该类是Java反射的源头 在 Class类中没有定义构造方法 ,那么得到Class类对象的方法有3种: (1)使用forName()的静态方法实例化对象 (2) 类.class (3)对象.getClass() package cn.reflect; class Demo{ } public class RefDemo01 { public static void main(String[] args) throws ClassNotFoundException { Class c1 = Class.forName("cn.reflect.Demo"); Class c2 =

学习:java原理—反射机制

风流意气都作罢 提交于 2020-01-13 01:22:10
一、什么是反射: 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力。这一概念的提 出很快引发了计算机科学领域关于应用反射性的研究。它首先被程序语言的设计领域所采用,并在Lisp和面向对象方面取得了成绩。其中 LEAD/LEAD++ 、OpenC++ 、MetaXa和OpenJava等就是基于反射机制的语言。最近,反射机制也被应用到了视窗系统、操作系统和文件系统中。 反射本身并不 是一个新概念,尽管计算机科学赋予了反射概念新的含义。在计算机科学领域,反射是指一类应用,它们能够自描述和自控制。也就是说,这类应用通过采用某种机 制来实现对自己行为的描述(self-representation)和监测(examination),并能根据自身行为的状态和结果,调整或修改应用 所描述行为的状态和相关的语义。 二、什么是Java中的类反射: Reflection 是 Java 程序开发语言的特征之一,它允许运行中的 Java 程序对自身进行检查,或者说“自审”,并能直接操作程序的内部属性和方法。Java 的这一能力在实际应用中用得不是很多,但是在其它的程序设计语言中根本就不存在这一特性。例如,Pascal、C 或者 C++ 中就没有办法在程序中获得函数定义相关的信息。 Reflection 是 Java 被视为动态(或准动态)语言的关键

java的method反射机制(二)

依然范特西╮ 提交于 2020-01-12 19:24:31
在java web 开发中,我们经常会遇到,从后台获取前台的值,将获取的值通过set方法赋值给实体,然后将实体存入数据库中,有时候对于实体属性多时,代码量很大(其实都是那些set方法),所以针对这点,我们可以通过method反射机制,写个通用的底层方法(对任何实体都有效),这样一来,我们就不用再去一个一个set到实体中去。 public static Object ObjectMethod(Object obj,HttpServletRequest request){ Field[] fields = obj.getClass().getDeclaredFields(); for(Field field:fields){ String md = "set"+StringUtils.capitalize(field.getName()); try { Method method = obj.getClass().getDeclaredMethod(md, field.getType()); if("java.lang.String".equals(field.getType().getName())){ String value = request.getParameter(field.getName()); method.invoke(obj, value); }else if(

Java反射

谁都会走 提交于 2020-01-12 15:19:11
今天在程序中用到java反射机制时,遇到的问题记录一下:我当时遇到的问题是,我用反射getMethod()调用类方法时,发生 NoSuchMethodException异常,后来上网发现getMethod()调用公共方法,不能反射调用私有方法,后来找到 getDeclaredField()能够访问本类中定义的所有方法。后来用这个方法解决了我遇到的问题。我查了java api文档,其中详细说明如下: Method getDeclaredMethod(String name, Class… parameterTypes)d 返回一个 Method 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明方法。 Method[] getDeclaredMethods() 返回 Method 对象的一个数组,这些对象反映此 Class 对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。 Method getMethod(String name, Class… parameterTypes) 返回一个 Method 对象,它反映此 Class 对象所表示的类或接口的指定公共成员方法。 Method[] getMethods() 返回一个包含某些 Method 对象的数组,这些对象反映此 Class 对象所表示的类或接口

Java 反射

醉酒当歌 提交于 2020-01-12 13:00:52
概述 定义 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。 用途 在日常的第三方应用开发过程中,经常会遇到某个类的某个成员变量、方法或是属性是私有的或是只对系统应用开放,这时候就可以利用Java的反射机制通过反射来获取所需的私有成员或是方法。当然,也不是所有的都适合反射,之前就遇到一个案例,通过反射得到的结果与预期不符。阅读源码发现,经过层层调用后在最终返回结果的地方对应用的权限进行了校验,对于没有权限的应用返回值是没有意义的缺省值,否则返回实际值起到保护用户的隐私目的。 反射机制的相关类 与Java反射相关的类如下: 类名 用途 Class类 代表类的实体,在运行的Java应用程序中表示类和接口 Field类 代表类的成员变量(成员变量也称为类的属性) Method类 代表类的方法 Constructor类 代表类的构造方法 Class类 Class代表类的实体,在运行的Java应用程序中表示类和接口。在这个类中提供了很多有用的方法,这里对他们简单的分类介绍。 获得类相关的方法 方法 用途 asSubclass(Class clazz) 把传递的类的对象转换成代表其子类的对象 Cast 把对象转换成代表类或是接口的对象

Java反射机制

一笑奈何 提交于 2020-01-11 23:28:18
一、什么是反射? 在运行状态中,对于任意一个类,都能够获取到这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意一个方法和属性(包括私有),这种动态获取的信息,及调用对象的方法的功能就称为Java的反射机制。 二、获取类对象 1、什么是类对象?   创建Dog类和Cat类 public class Dog { private String name; private int age; public Dog() { } public Dog(String name, int age) { this.name = name; this.age = age; } /*getter and setter*/ } public class Cat { private String name; private String hobby; /*getter and setter*/ }   实例化两个Dog类的对象 Dog dog1 = new Dog("大黄", 5); Dog dog2 = new Dog("小黑", 3); 在理解类对象之前,先说我们熟悉的对象之间的区别: dog1和dog2都是 Dog对象 ,他们的区别在于,各自有 不同的名称、年龄 。 然后说说类之间的区别   Dog和Cat都是类,他们的区别在于有 不同的方法,不同的属性 。 类对象

java 利用反射机制,获取实体所有属性和方法,并对属性赋值

两盒软妹~` 提交于 2020-01-11 23:00:13
一个普通的实体Person: private int id; private String name; private Date createdTime;...//其它字段// get set方法 ............... 现在需要把通过webService传过来的实体Person里面的所有字段的null值,换成"" 实现思路: 1.获取实体的所有字段,遍历 2.获取字段类型 3.调用字段的get方法,判断字段值是否为空 4.如果字段值为空,调用字段的set方法,为字段赋值 code: Field[] field = model.getClass().getDeclaredFields(); // 获取实体类的所有属性,返回Field数组 try { for (int j = 0; j < field.length; j++) { // 遍历所有属性 String name = field[j].getName(); // 获取属性的名字 name = name.substring(0, 1).toUpperCase() + name.substring(1); // 将属性的首字符大写,方便构造get,set方法 String type = field[j].getGenericType().toString(); // 获取属性的类型 if (type.equals(

Java反射常见面试题

社会主义新天地 提交于 2020-01-11 08:59:49
Java反射常见面试题 什么是反射? 反射是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为 Java 语言的反射机制。 哪里用到反射机制? JDBC中,利用反射动态加载了数据库驱动程序。 Web服务器中利用反射调用了Sevlet的服务方法。 Eclispe等开发工具利用反射动态刨析对象的类型与结构,动态提示对象的属性和方法。 很多框架都用到反射机制,注入属性,调用方法,如Spring。 什么叫对象序列化,什么是反序列化,实现对象序列化需要做哪些工作? 对象序列化,将对象中的数据编码为字节序列的过程。 反序列化;将对象的编码字节重新反向解码为对象的过程。 JAVA提供了API实现了对象的序列化和反序列化的功能,使用这些API时需要遵守如下约定: 被序列化的对象类型需要实现序列化接口,此接口是标志接口,没有声明任何的抽象方法,JAVA编译器识别这个接口,自动的为这个类添加序列化和反序列化方法。 为了保持序列化过程的稳定,建议在类中添加序列化版本号。 不想让字段放在硬盘上就加transient 以下情况需要使用 Java 序列化: 想把的内存中的对象状态保存到一个文件中或者数据库中时候; 想用套接字在网络上传送对象的时候; 想通过RMI(远程方法调用)传输对象的时候。

Unity3D游戏GC优化总结---protobuf-net无GC版本优化实践

独自空忆成欢 提交于 2020-01-11 05:02:53
一  protobuf-net优化效果图   protobuf-net是Unity3D游戏开发中被广泛使用的Google Protocol Buffer库的c#版本,之所以c#版本被广泛使用,是因为c++版本的源代码不支持Unity3D游戏在各个平台上的动态库构建。它是一个网络传输层协议,对应的lua版本有两个可用的库:一个是proto-gen-lua,由tolua作者开发,另外一个是protoc,由云风开发。protobuf-net在GC上有很大的问题,在一个高频率网络通讯的状态同步游戏中使用发现GC过高,所以对它进行了一次比较彻底的GC优化。下面是优化前后的对比图: protobuf-net优化前GC和性能效果图 protobuf-net优化后GC和性能效果图 二  Unity3D游戏GC优化概述   有关Unity3D垃圾回收的基本概念和优化策略Unity官网有发布过文章: Optimizing garbage collection in Unity games 。这篇文章讲述了Unity3D垃圾回收机制,和一些简单的优化策略,讨论的不是特别深入,但是广度基本上算是够了。我罗列一下这篇文章的一些要点,如果你对其中的一些点不太熟悉,建议仔细阅读下这篇文章:   1、C#变量分为两种类型:值类型和引用类型,值类型分配在栈区,引用类型分配在堆区,GC关注引用类型   2

四大神器之反射

你说的曾经没有我的故事 提交于 2020-01-10 23:38:59
Java反射机制,是一个基础的内容章节,在对于之后的框架学习中起到了至关重要的作用,现在比较流行的是spring 框架 ,其中的IOC(自动注入)以及AOP(动态代理),在AOC中代理模式又分为动态代理和byteCode instrument(插桩)或者是CGLIB 。 在学习Java反射机制前,首先问一个问题:在Java运行时,对于任意一个类,能否知道这个类有那些属性和方法?对 于任意一个对象,能否调用它任意一个方法? 答案是肯定的。可以! 在这里要去区别一个事情:如果说在自己写的类中去改一个数据类型或者说属性,那只是在编译时,并不是在运行 时。 反射机制的几大功能: 在运行时,判断任意一个对象所属类。 在运行时,构造任意一个对象。 在运行时,判断任意一个类所具有的成员变量和方法 在运行时,调用任意一个对象的方法。 一般而言:程序运行时,允许改变程序结构和变量类型成为动态语言。由此可见Java并不是动态语言,但是Java有一 个动态相关的机制Reflection,可以运行时加载、探知、使用编译期间完全未知的classes(但是methods定义不知 道)。所以Reflection是Java视为动态语言的关键性质,允许在程序运行时通过Reflection APIs 取得任何一个已知名 称的class的内部信息。(包括父类,接口,变量,方法等)。 接下来我们用代码来举一个例子。