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. Spring boot 整合jsp、thymeleaf、freemarker

    1.创建spring boot 项目 2.pom文件配置如下: <dependencies> <dependency> <groupId>org.springfra ...

  2. 四则运算UI组结对作业报告

    Github提交地址: 小组成员:陈兆庭,陈昶金: 一.编程阶段 清明节开始接触和调研关于UI设计的方法.由于两人的各方面知识储备均不足,在各种东西C#.MFC.Qt中进行调查和讨论,最终因为网上说Q ...

  3. How to modify a compiled Android application (.apk file)

    Today I’d like to share with you my findings about how an existing .apk file can be modified. An .ap ...

  4. oracle 修改数据 保险方法

    oracle 中修改比较安全的方法:(pl/sql) 第一种方法: select * from temp where id=9 for update; 第二种方法: select t.*,rowid ...

  5. Codeforces Round #320 (Div. 2) [Bayan Thanks-Round] E 三分+连续子序列的和的绝对值的最大值

    E. Weakness and Poorness time limit per test 2 seconds memory limit per test 256 megabytes input sta ...

  6. hihocoder #1415 : 后缀数组三·重复旋律3

    #1415 : 后缀数组三·重复旋律3 Time Limit:5000ms Case Time Limit:1000ms Memory Limit:256MB 描述 小Hi平时的一大兴趣爱好就是演奏钢 ...

  7. Docker(八):私有仓库

    有时候使用Docker Hub这样的公共仓库可能不太方便,用户可以创建一个本地仓库供私人使用. 在安装了Docker之后,可以获取官方的registry镜像来运行,docker-registry是官方 ...

  8. linux 共享内存 信号量 同步

    这篇文章将讲述别一种进程间通信的机制——信号量.注意请不要把它与之前所说的信号混淆起来,信号与信号量是不同的两种事物.有关信号的更多内容,可以阅读我的另一篇文章:Linux进程间通信——使用信号.下面 ...

  9. python print的参数介绍

    参考print的官方文档 print(...) print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False) Prints th ...

  10. javascript 获取焦点和失去焦点事件

    利用传参的方式提高方法的复用性 这里涉及到JavaScript的字符串拼接操作 </tr> <<tr height="40px"> <td> ...