>反射要注意的点:

  • 反射入口,怎么获取类、方法、属性对象
  • 其中方法中特殊的:通过反射的构造来获取对象
  • 其中属性中的应用:通过反射的属性对象 获取属性名 拼接get/set方法名 进一步调用方法的应用

>获取入口点Class<?> 的方式:

  • Class.forNme()
  • 类名.class
  • 对象引用.getClass()

>Reflection初步,以及解析一个类的信息

public class Re {/*** 反射?(自己分析自己:通过自己的语法分析自己的类结构,并且能够动态执行自己的类)* 通过反射可以分析一个类的信息/结构 * 可以执行一个类的方法  有些类没有办法new 比如在远端,不在当前的class path下* * spring ioc(工厂方法模式) aop(代理模式/bytecode instrument:插桩,修改字节码文件;一个重要的库:cglib主要完成插桩功能)* 1.编译时环境:Java代码和编译成class文件的阶段;运行时环境:jvm运行编译后的class文件的阶段;*   源码-->编译-->字节码-->运行*   在Java的运行环境中,对于任意一个类,可以通过反射,知道这个类有哪些属性和方法;对于任意一个对象可以通过反射调用它的任意一个方法;*   反射机制(reflection):动态获取类的信息,动态调用对象的方法* * 2.re主要功能:*   在运行时判断任意一个对象所属的类*   在运行时构造任意一个类的对象  (在编译期,我们可以通过new写在程序代码里)*   在运行时判断任意一个类所具有的成员变量和方法*   在运行时调用任意一个对象的方法* * 3.re概念:*   Java动态语言性质(准动态语言):re机制允许程序在运行时透过Java提供的Reflection API取得任意一个  已知名称  的类的内部信息*   包括:其modifiers(如public static...)、superclass(如Object...)、实现之Interface(如Serializable)*   也包括field成员变量和method方法的所有信息*   并可以在运行时改变field的内容或者调用method方法*   如:Spring中 bean的信息配置在 applicationContext.xml中,配置的类的名字都是字符串,Spring如何将字符串对应的类生成出来? 反射!*   没有反射,所有的框架都不存在。*   * 4.动态语言概念:*   “程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言” 如: var a="hello"; a=1;*   从这个观点看:Perl,Python,Ruby是动态语言 ;C++,Java,C#不是动态语言;*   但是Java具有动态相关机制:Reflection。我们可以在  运行时  加载,探知,使用编译期间完全未知的classes。*   换句话说,Java程序可以加载一个运行时才得知名称的class,获悉完整的构造(不包括method定义:内部具体实现),并生成对象实体,或对其field设值,或唤起其method。*   这种“看透class”的能力,称为introspection。*   * 5.Re API*   JDK中,主要由以下类实现Java反射机制:*   (主要位于java.lang.reflect包中)*   --Class类:代表一个类*   --Field类:代表类的成员变量*   --Method类:代表类的方法*   --Constructor类:代表类的构造方法*   --Array类:提供动态创建数组,以及访问数组的元素的静态方法* @throws ClassNotFoundException *   *///从命令行接收一个字符串(该字符串是某个类的全名)//打印出该类中所有的所有的方法声明public static void main(String[] args) throws ClassNotFoundException {//java.lang.Class java中每个对象都会有一个与之关联的Class对象,Class对象是jdk启动的时候就加载的,Class对象是唯一的;如生成了n个字符串对象,都会唯一的对应一个Class对象。//Class类是反射的入口点,Re必须从Class开始Class<?> classType=Class.forName(args[0]);//编译时jdk并不知道这是什么,运行时传入//对于类中定义的任意一个方法,都会有一个与之关联的Method对象,可以获得除了方法体之外的内容Method[] methods = classType.getDeclaredMethods();for(Method method : methods){System.out.println(method);}}
}

>通过反射获取一个类的实例和方法的调用

public class InvokeTester {public int add(int para1, int para2) {return para1 + para2;}public String echo(String msg) {return "hello" + msg;}public static void main(String[] args) throws Exception {//java内置的语法形式.class 会获得InvokeTester类所对应的Class对象Class<?> classType = InvokeTester.class;//创建一个Class对象 所表示的类 的实例,newInstance使用条件:需要一个不带参数的构造方法Object invokeTester = classType.newInstance();//以上两行代码等价于InvokeTester it = new InvokeTester();//获取add()方法对应的Method对象(需要名字和参数;返回值并不属于Java方法重载的范畴)  ...可变参数/相当于一个数组Method addMethod = classType.getMethod("add", new Class[]{int.class,int.class});//                               方法所在目标对象               参数Object result = addMethod.invoke(invokeTester, new Object[]{1,2});System.out.println((Integer)result);//3//以上两行代码等价于it.add(1, 2);Method echoMethod = classType.getMethod("echo", new Class[]{String.class});result = echoMethod.invoke(invokeTester, "java");System.out.println((String)result);//hellojava//以上两行代码等价于it.echo("java");}
}

>反射构造方式获取一个类的实例、反射属性进一步反射get/set方法

public class ReflectTester {public Object copy(Object object) throws Exception {Class<?> classType = object.getClass();System.out.println(classType.getName());// 通过构造方法生成类的实例 构造方法看参数区分Constructor<?> constructor = classType.getConstructor(new Class[] {});Object objectCopy = constructor.newInstance(new Object[] {});// 上面两行代码等价于(仅能用于不带参构造)Object objectCopy2 = classType.newInstance();// 获得对象所有的属性Field[] fields = classType.getDeclaredFields();for (int i = 0; i < fields.length; ++i) {Field field = fields[i];String fieldName = field.getName();// 获得属性的首字母并转换为大写 区间一般为左闭右开String firstLetter = fieldName.substring(0, 1).toUpperCase();// 获得属性对应的getXXX() 名字String getMethodName = "get" + firstLetter + fieldName.substring(1);// 获得属性对应的setXXX() 名字String setMethodName = "set" + firstLetter + fieldName.substring(1);// 获取get方法对应的method对象Method getMethod = classType.getMethod(getMethodName, new Class[] {});// 获取set方法对应的method对象Method setMethod = classType.getMethod(setMethodName, new Class[] { field.getType() });Object value = getMethod.invoke(object, new Object[] {});System.out.println(fieldName + ":" + value);setMethod.invoke(objectCopy, new Object[] { value });}return objectCopy;}public static void main(String[] args) throws Exception {Customer customer = new Customer();customer.setId(new Long(1));customer.setName("zhangsan");customer.setAge(18);Customer customerCopy = (Customer) new ReflectTester().copy(customer);System.out.println(customerCopy.getId() + "," + customerCopy.getName() + "," + customerCopy.getAge());}
}class Customer {private Long id;private String name;private int age;public Customer() {// TODO Auto-generated constructor stub}public Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}}

Java 反射(初步)相关推荐

  1. C++仿Java反射机中字符串创建类的思想,初步实现

    目录 理论 实例 理论 因为上午对Java反射机制有了跟进一步认识,这里用C++模仿下,他的思想,并且简单实现了下,这里只是模仿他的思想! 这个思想为: 如果有一个class A,可以使用new A( ...

  2. java反射最佳实践,java反射性能测试分析

    java反射性能测试分析 java有别于其他编程语言而让我着迷的特性有很多,其中最喜欢的是接口设计,他让我们设计的东西具有美感.同样反射也是我比较喜欢的一个特性,他让程序自动运行,动态加载成为了可能, ...

  3. 关于java反射机制(基础篇)

    关于java的反射机制,有一些初步的理解,但是依然存在几点困惑.先将自己理解的部分分享其下,并提出困惑,之后完善. 1. java反射机制是什么? 从两个概念切入:反射机制和java反射机制 ①反射机 ...

  4. Java 反射 (Class、ClassLoader、Constructor、Method、Field)

    反射是Java中一个非常重要.非常强大的机制.曾看到一句话"反射是框架的灵魂",初学时不懂,等到学完框架之后才慢慢理解其意. 什么是反射?我们先通过几个类和示例来初步体会一下反射. ...

  5. Java 反射机制[Field反射]

    Java 反射机制[Field反射] 1.  反射概念及功能 反射就是把Java类中的各种成分映射成对应的Java类.比如一个Java类中用一个Class类的对象来表示. 一个类中的组成部分分为成员变 ...

  6. java反射 pdf_java反射学习笔记整理.pdf

    java反射学习笔记整理.pdf 还剩 15页未读, 继续阅读 下载文档到电脑,马上远离加班熬夜! 亲,很抱歉,此页已超出免费预览范围啦! 如果喜欢就下载吧,价低环保! 内容要点: Java 反射笔记 ...

  7. Java 反射 (快速了解反射)

    反射的概念 JAVA反射机制是在运行状态中,对于任意一个实体类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象方法的功能称为java ...

  8. java 获取 反射 方法 名_乐字节Java反射之一:反射概念与获取反射源头Class

    一.Java反射机制概念 "程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言",如Python, Ruby是动态语言:显然C++,Java,C#不是动态语言,但是JAV ...

  9. Java反射以及应用

    需求:需要通过反射动态获取类的字段类型,然后做特殊处理 Java反射getDeclaredField和getField的区别 getDeclaredFiled 只能获取类本身的属性成员(包括私有.共有 ...

最新文章

  1. 当谈论迭代器时,我谈些什么?
  2. STM32中STD、HAL、LL库比较
  3. python 二进制流_Python中对字节流/二进制流的操作:struct模块简易使用教程
  4. 计算机断电后会丢失的是什么,计算机突然停电,什么数据会丢失?
  5. python读取文件夹下所有文件的名称_python2.7 学习之读取文件夹下所有文件名称及内容...
  6. php 类自动执行,php类中的魔术方法及类的自动加载
  7. mysql 字符串 索引优化_轻松优化MySQL-之索引优化1
  8. cisco学习笔记(6)-acl
  9. ARM嵌入式开发,高通MSM8937核心板h
  10. 理科女生计算机与会计学选择,我是一理科女生、在报考学校时候、选择会计还是会计电算化比较好呢?还有会计与审计、会计于统计核算....
  11. starbound服务器配置文件怎么写,【mod向】简单修改文件迅速刷到任何想要物品以及修改随机生成物品入手时数据可以带入任何服务器【修改向】...
  12. 心理测试html5,50个最准心理测试题 非常准的心理测试题
  13. 葫芦娃手游服务器未响应,葫芦娃手游闪退解决方法_葫芦娃手游闪退原因_玩游戏网...
  14. java学习总结(16.05.25)eclipse的查找和替换功能 Ctrl+F
  15. 漫画安全HIDS、EDR、NDR、XDR
  16. 虚拟主机mv命令选项移动文件夹
  17. 真!AI低代码平台——瀚码编程小助手“叨叨“正式上线!
  18. Spark 任务提交流程说明
  19. Oracle 11g重建控制文件——控制文件全部丢失,从零开始
  20. 使用 iview 实现PC端生成推广海报与二维码并下载的功能,基于iview Modal 对话框 与 Carousel 走马灯组件实现

热门文章

  1. 关于String,StringBuffer和StringBuilder之间的区别和联系
  2. docker搭建replication集群
  3. springcloud使用feign进行远程服务调用
  4. bzoj 4031 [HEOI2015]小Z的房间
  5. 小米们要“造反”,开撕三大运营商
  6. RHEL5简单的引导故障解决
  7. maven仓库启用国内云的方法,含完整配置文件
  8. Linux 中安装 Mysql
  9. java itextpdf使用HTML模板生成pdf文件,并设置table
  10. 以太坊—JSON RPC API