1、反射的基础
  反射的基石----》Class类
  java程序中的各个java类属于同一类事物,描述这类事物的java类名就是Class

  获取字节码对应的实例对象(Class类型)
  class cls1 = Person.class//字节码1;
  p1.getClass();
  Class.forName("java.lang.String"); 主要用这种进行反射

  8个基本类型,对应着8个Class对象
  void.class 对象

    String str1 = "abc";
Class cls1 = str1.getClass();
Class cls2 = String.class;
Class cls3 = Class.forName("java.lang.String");
cls1==cls2 //true
cls1==cls3 //true
int.class.isPrimitive //true
int.class == Integer.class //flase
int.class == Integer.TYPE //true
数组类型的Class实例对象 Class.isArray()

2反射的概念
  反射就是把java类中的各种成分映射成对应的java类
  例如:
  成员变量---》Field对象
  方法----》Method对象
  构造方法---》Constructor对象
  ...

3、 构造方法的反射应用

  Constructor类代表某一个构造方法

//new String(new StringBuffer("abc"))
  Constructor constructor1 = String.class.getConstructor(StringBuffer.class);
  String str2=(String)constructor1.newInstance(new StringBuffer("abc"))

  class -> constructor -> new object

  反射会导致程序性能下降

  Class.newInstance()方法
  例如:String obj = (Class)Class.forName("java.lang.String").newInstance();
  该方法内部先得到默认的构造方法,然后用该构造方法创建实例对象
  用了缓存机制来保存默认构造方法的实例对象

 

4、成员变量的反射

  Field类代表某各类中的一个成员变量

    public class ReflectPoint{
private int x;
public int y;
...构造方法
} ReflectPoint pt1 = new ReflectPoint(3,5);
//fieldY不是对象身上的变量,而是类上的,要用它取对应对象上的属性值
Field fieldY = pt1.getClass().getField("y"); //public
fieldY.get(pt1); // 5
Field fieldX = pt1.getClass().getDeclaredField("x");//private
filedX.setAccessible(true);//暴力反射
fieldX.get(pt1); public class ReflectPoint{
public String str1 ="ball";
public String str2 ="basketball";
public String str3 ="itcast";
} private static void changeStringValue(Object obj){
Field[] fields = obj.getClass.getFields();
for(Field field:fields){
//对字节码的比较用==号比 因为同一份字节码
if(field.getType() == String.class){
String oldValue =(String)field.get(obj);
String newValue = oldValue.replace('b','a');
field.set(obj,newValue);
}
}
}

5 、成员方法的反射

  Method类代表某个类中的一个成员方法

 Method methodCharAt = String.class.getMethod("charAt",int.class);
  //调用方法一定是在一个对象上
  String str1="abc";
  methodCharAt.invoke(str1,1);

  如果传递给Method对象的invoke()方法的第一个参数为null,说明
  该Method对象对应的是一个静态方法

6 、对接受数组参数的成员方法进行反射

  用反射方式执行某个类中的main方法

public class TestArguments{
public static void main(String[] args){
for(String arg:args){
System.out.println(arg);
}
}
} String clazz = "com.test.TestArguments";
Method mainMethod = Class.forName(clazz).getMethod("main",String[].class);
mainMethod.invoke(null,new Object[](new String[]{"111","222"}));
mainMethod.invoke(null,(Object)new String[]{"111","222"});
//编译器会做特殊处理,编译时不将参数作为数组看待,也就不会讲数组打算成若干参数了

7、 数组与Object的反射

  相同的元素且相同的维度则是同一份字节码文件

   int[] a1 = new int[3];
int[] a2 = new int[4];
int[][] a3 = new int[2][3];
String[] a4 = new String[3];
a1.getClass() == a2.getClass();//true
a1.getClass() == a3.getClass();//false
a1.getClass() == a4.getClass();//false

基本类型的数组是不能转为Object数组
Object[] aobj = a1//error

具有相同维数和元素类型的数组属于同一个类型,即具有相同的Class实例对象

代表数组的Class实例对象的getSuperclass()方法返回的父类为Object类对应的Class

基本类型的一维数组可以被当做Object类型使用,不能当作Object[]类型使用,非基本类型的一维数组,既可以当做Object类型使用,又可以当做Object[]类型使用

Arrays.asList()方法处理int[]和String[]存在差异Arrays工具类用于完成对数组的反射操作

private static void printObject(Object obj){
Class clazz = obj.getClass();
if(clazz.isArray()){
int len = Array.getLength();
for(int i=0;i<=len;i++){
System.out.println(Array.get(obj,i));
}
}else{
System.out.println(obj);
}
}

java基础篇3之反射的更多相关文章

  1. 小白—职场之Java基础篇

    java基础篇 java基础 目录 1.java是一种什么语言,jdk,jre,jvm三者的区别 2.java 1.5之后的三大版本 3.java跨平台及其原理 4.java 语言的特点 5.什么是字 ...

  2. Java基础篇(JVM)——类加载机制

    这是Java基础篇(JVM)的第二篇文章,紧接着上一篇字节码详解,这篇我们来详解Java的类加载机制,也就是如何把字节码代表的类信息加载进入内存中. 我们知道,不管是根据类新建对象,还是直接使用类变量 ...

  3. java基础篇---I/O技术

    java基础篇---I/O技术   对于任何程序设计语言而言,输入输出(I/O)系统都是比较复杂的而且还是比较核心的.在java.io.包中提供了相关的API. java中流的概念划分 流的方向: 输 ...

  4. 金三银四跳槽季,BAT美团滴滴java面试大纲(带答案版)之一:Java基础篇

    Java基础篇: 题记:本系列文章,会尽量模拟面试现场对话情景, 用口语而非书面语 ,采用问答形式来展现.另外每一个问题都附上“延伸”,这部分内容是帮助小伙伴们更深的理解一些底层细节的补充,在面试中可 ...

  5. java基础篇---HTTP协议

    java基础篇---HTTP协议   HTTP协议一直是自己的薄弱点,也没抽太多时间去看这方面的内容,今天兴致来了就在网上搜了下关于http协议,发现有园友写了一篇非常好的博文,博文地址:(http: ...

  6. java基础篇---I/O技术(三)

    接上一篇java基础篇---I/O技术(二) Java对象的序列化和反序列化 什么叫对象的序列化和反序列化 要想完成对象的输入或输出,还必须依靠对象输出流(ObjectOutputStream)和对象 ...

  7. Java基础篇 - 强引用、弱引用、软引用和虚引用

    Java基础篇 - 强引用.弱引用.软引用和虚引用 原创零壹技术栈 最后发布于2018-09-09 08:58:21 阅读数 4936 收藏展开前言Java执行GC判断对象是否存活有两种方式其中一种是 ...

  8. java基础篇 之 构造器内部的多态行为

    java基础篇 之 构造器内部的多态行为 ​ 我们来看下下面这段代码: public class Main { public static void main(String[] args) { new ...

  9. java基础篇1

    JAVA基础篇1 注释 单行注释 //这是一个单行注释,由两个斜杠组成,不能嵌套多行注释 多行注释 /*这是一个 多行注释 ,//里面不能嵌套多行注释, 但是可以嵌套单行注释*/ 文档注释 /**ja ...

随机推荐

  1. Python学习-day15-JavaScript

    JavaScript是一门编程语言,浏览器内置了JavaScript语言的解释器,所以在浏览器上按照JavaScript语言的规则编写相应代码之,浏览器可以解释并做出相应的处理. 一.如何编写 1.J ...

  2. c4d 帮助 prime r16 usage

    c4d   帮助 prime cinema 4d   prime    c4d  基础 前言   usage 开始 双击程序图标   双击一个场景文件   用开始菜单  windows 二选一   从 ...

  3. [超级基础]Web安全之SQL注入由浅入深(?)

    前言 断断续续看Web安全到现在了,感觉对很多基础知识还是一知半解,停留在模糊的层次.所以准备系统总结一下. Sql注入我以前一直不以为然,一是现在能sql的站确实很少,二是有像sqlmap的工具可以 ...

  4. SQL Server 2014存储过程的备份和还原

    Sql Server 2014存储过程备份和恢复... 1 1.      备份存储过程:... 1 2.      还原... 8 Sql Server 2014存储过程备份和恢复 1. 备份存储过 ...

  5. 直接插入排序(java实现)

    这几天看排序算法,网上大多数排序算法的解释都是“过于专业”,导致一时半会看不明白到底在说什么玩意.现在总结下几大排序算法(java实现) 1.直接插入排序 说的简单点,就是一组无序序列{A1,A2,. ...

  6. [CQOI2014][bzoj3504] 危桥 [最大流]

    题面 传送门 思路 这道题中惟一的特别之处,就在于"危桥"这一个只能走两次的东西 我的第一想法是做一个dp,但是这道题只需要能不能走,也没有必要 网络流?貌似是个很好的选择 我们把 ...

  7. inline-block元素垂直对齐

    多个inline-block元素使用vertical-align:middle无法对齐,必须有个height:100%的子元素才行,通常使用伪元素.另一种方法是添加line-height:normal ...

  8. E-card

    E-card 题目描述 两个人各有n张牌 第一个人有n-1张平民和1张皇帝 第二个人有n-1张平民和1张奴隶 每次选择一张牌 进行对决 如果都是平民则平局 皇帝赢平民 奴隶赢皇帝 平民赢奴隶(显然只会 ...

  9. vue 中父子组件传值:props和$emit

    更新----------- 1 父组件向子组件传值:通过props数组: 在vue-cli Login.vue父组件中有AcceptAndRefuse.vue子组件,首先import进子组件hello ...

  10. css 文字垂直居中问题

    CSS 文字垂直居中问题 问题:在 div 中文字居中问题: 当使用 line-height:100%%; 时,文字没有居中,如下: html: <div id="header_log ...