知识点1:获取类字节码的三种形式

1、Class date = Date.class;//根据类名获取字节码
2、Date date= new Date();
date.getClass();//对象的形式获取字节码
3、Class.forName("java.util.Date");//完整名字获取字节码

知识点2:反射就是把java类中的各种成分映射成相应的java类。

知识点3:构造方法的反射:Constructor类代表某个类中的一个构造方法。

//得到某个类所有的构造方法
Constructor[] constructors = Class.forName("java.lang.String").getConstructors(); //得到某一个构造方法
Constructor constructor = Class.forName("java.lang.String").getConstructor(StringBuffer.class);
  通常方式:new String(new StringBuffer("abc"));
  反射方式:利用Constructor类实现
  //第一步:创建String类的构造方法,参数为StringBuffer。
  Constructor constructor1 = String.class.getConstructor(StringBuffer.class)
  //第二步:根据单例创建对象
  String str = (String)constructor1.newInstance(new StringBuffer("abc"));
  注意:StringBuffer.class为了创建构造方法,new StringBuffer("abc")为了创建对象,二者类名必须一致。 //Class.newInstance()方法
  例子:String obj = Class.forName("java.lang.String").newInstance();
  该方法先得到默认的构造方法,再用该构造方法创建实例对象
  该方法内部用到了缓存机制保存默认构造方法的实例对象。

知识点4:成员变量的反射:Field类代表某个类中的一个成员变量。

问题:得到的Field对象是对应到类上面的成员变量,还是对应对象上的成员变量?答案是对应类上面的成员变量。
ReflectPoint pt1 = new ReflectPoint(3,5);//ReflectPoint有两个成员变量,private x和public y
Field fieldy = pt1.getClass().getField("y");//根据对象名获取字节码,通过getField()方法传入成员变量名获取成员变量
int y = fieldy.get(pt1);//根据指定对象获取成员变量的值 Field fieldx = pt1.getClass().getDeclaredField("x");//对于私有的成员变量,通过getDeclaredField()方法获取成员变量
fieldX.setAccessible(true);//由于是私有的,需要通过该方法强行获取值
int x= fieldx.get(pt1);//根据指定对象获取成员变量的值
例子:利用反射修改成员变量的值
private static void changeStringValue(Object obj) throws Exception{
Field[] fields = obj.getClass().getField();//根据传过来的形参对象获取所有成员变量
for(Field field:fields){
if(field.getType() == String.class){//判断类型是否等于String
String oldValue = (String)field.get(obj);
String newValue = olldValue.replace('b', 'a');
field.set(obj, newValue);//设置成员变量为新的值
}
}
}

知识点5:方法的反射:Method类代表某个类中的一个成员方法。

//得到一个类中的某一个方法,需要传入方法的名字和参数。
Method charAt = String.class.getMethod("charAt",int.class); 调用形式
str.charAt(1);//通常方式
charAt.invoke(str,1);//反射方式,参数为对象名称和参数。
注意:如果传递给Method对象的invoke()方法的一个参数为null,说明该Method对象对应的是一个静态方法。 main方法的反射:
Class class = Class.forName(arg[0]);//args[0]代表类名
Method methodMain = class.getMethod("main",String[].class);
methodMain.invoke(null,new Object[]{new String[]{"aaa","bbb"}});//因为main方法是静态方法,所以第一个参数为null
methodMain.invoke(null,(Object)new String[]{"aaa","bbb"});//上面这两种方式都可以

知识点6:数组的反射

1、具有相同维数和元素类型的数组属于同一个类型,即具有相同的Class实例对象
2、代表数组的Class实例对象的getSuperclass()方法返回的父类为Object类对应的Class。
3、基本类型的一维数组可以被当做Object类型使用,不能当做Object[]类型使用;非基本类型的一维数组,既可以当做Object类型使用,也可以当做Object[]类型使用。
4、Arrays.asList()方法处理int[]和String[]时有差异。int[]使用输出[I@hash值,String可以输出具体值:a,b,c
5、Arrays工具类用于完成对数组的反射操作。

java反射的更多相关文章

  1. 第28章 java反射机制

    java反射机制 1.类加载机制 1.1.jvm和类 运行Java程序:java 带有main方法的类名 之后java会启动jvm,并加载字节码(字节码就是一个类在内存空间的状态) 当调用java命令 ...

  2. Java反射机制

    Java反射机制 一:什么事反射机制 简单地说,就是程序运行时能够通过反射的到类的所有信息,只需要获得类名,方法名,属性名. 二:为什么要用反射:     静态编译:在编译时确定类型,绑定对象,即通过 ...

  3. java反射(基础了解)

    package cn.itcast_01; /** *Person类 */ public class Person {    /** 姓名 */    private String name;     ...

  4. java基础知识(十一)java反射机制(上)

    java.lang.Class类详解 java Class类详解 一.class类 Class类是java语言定义的特定类的实现,在java中每个类都有一个相应的Class对象,以便java程序运行时 ...

  5. java基础知识(十一)java反射机制(下)

    1.什么是反射机制? java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象都能够调用他的属性和方法,这种动态获取属性和方法的功能称为java的反射机制. ...

  6. java反射学习之二万能EXCEL导出

    一.EXCEL导出的实现过程 假设有一个对象的集合,现在需要将此集合内的所有对象导出到EXCEL中,对象有N个属性:那么我们实现的方式是这样的: 循环这个集合,在循环集合中某个对象的所有属性,将这个对 ...

  7. java反射学习之一反射机制概述

    一.反射机制背景概述 1.反射(reflection)是java被视为动态语言的一个关键性质 2.反射机制指的是程序在运行时能获取任何类的内部所有信息 二.反射机制实现功能概述 1.只要给定类的全名, ...

  8. java反射 之 反射基础

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

  9. java反射 cglib asm相关资料

    有篇文章对java反射的调用的效率做了测试,写的比较好.猛击下面地址 http://www.blogjava.net/stone2083/archive/2010/09/15/332065.html ...

  10. 超详细的java反射教程

    看技术博客时,看到关于java反射的博文,写的非常好.猛击下面的地址,开始java反射之旅 中文翻译地址:http://ifeve.com/java-reflection/ 英文原版地址:http:/ ...

随机推荐

  1. mvn-打jar运行包(含环境变量配置)

    前沿条件 maven下载:http://maven.apache.org/download.cgi 配置环境变量 MAVEN_HOME= D:\Softwares\apache-maven-3.2.2 ...

  2. vs2015提示中文

    解决方案:   1.找到这个目录 C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework 进入 \v ...

  3. BZOJ 1226: [SDOI2009]学校食堂Dining

    1226: [SDOI2009]学校食堂Dining Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 730  Solved: 446[Submit][ ...

  4. css使absolute相对于父容器进行定位而不是以body(为什么绝对定位(absolute)的父级元素必须是相对定位(relative))

    借知乎的回答如下解释: 首先,我想告诉你的是,如果父级元素是绝对定位(absolute)或者没有设置,里面的绝对定位(absolute)自动以body定位.这句话是错的.正确的是:只要父级元素设了po ...

  5. Beta阶段发布说明

    OverWatch来浪狼人杀助手Beta版本发布说明 Beta版本的新功能 添加了忘记密码与重置密码的功能 添加了语音流程提示的功能 添加了搜索好友的功能 添加了添加好友的功能 添加了能够直接通过点击 ...

  6. 【原创】自己动手写工具----XSmartNote [Beta 1.0]

    一.背景 有个朋友是在他们单位的市场部,手里的策划文案以及PPT,少则数百,多则上千,多年下来也是一笔不可小觑的财富,每一次新的策划都可以从以往的文案或PPT中“拿来主义”,有着很好的借鉴意义,但是这 ...

  7. redis 操作 hash 的测试

    1>hset setname field value hset stuSet name zhangsan:1        2>hget setname field hget stuset ...

  8. MyEclipse:各种提示图标的含义

    1.新建的项目,项目名称前有黄色小警示号的原因, 2.项目名称上有红色叹号,说明缺少jar包,仔细找一下,看看缺了什么,添加进去一般就好了. 3.出现红色叉号,那说明代码错误,需要修改代码.

  9. HTML 5 胜出:XHTML2 宣告夭折

    自HTML 5 和XHTML 2规范草稿公布以来,一直存在很大的争议.HTML 5是由包括Google.Mirosoft.Mozilla.Opera.Apple在内多家浏览器厂商共同起草的下一代web ...

  10. HDU 2087 字符串

    #include <stdio.h> #include <string.h> void main() { ) { ] = {'\0'}; ] = {'\0'}; ; scanf ...