android培训、物联云计算培训、 java培训、期待与您交流! ----------

反射

透彻分析反射的基础_Class类

JAVA类用于描述一类事物的共性,JAVA程序中的各个JAVA类属于同一类事物,类名就是Class.

Class类描述类的名字、访问属性、所属包名、字段、方法名称的列表等

一个类被类加载器加载到内存中,占用一个存储空间,不同类的字节码是不同的,但类型相同

得到字节码对应的实例对象?

类名.class; 对象.getClass(); Class.forName(“类名”)

作用:返回字节码

方式:字节码直接返回,加载后返回

九个预定义Class实例对象(八个基本类型+void

System.out.println(int.class.isPrimitive());//true 是否为原始类型

System.out.println(int.class = =Integer.class);//fasle

System.out.println(int.class = =Integer.TYPE);//true

System.out.println(int[].class.isPrimitive());//false 是否为原始类型

System.out.println(int[].class.isArray());//数组类型的Class实例对象用的是Class.isArray()

反射的概念

反射就是把JAVA类中的各种成分映射成相应的java类

一个类中的每个成员都可以用相应的反射API类的一个实例对象表示

构造方法的反射应用

Constructor类代表某个类的一个构造方法

得到所有的构造方法

Constructor<?>[] getConstructors()

得到某一个的构造方法

Constructor<T> getConstructor(Class<?>... parameterTypes)

创建实例对象

//new String(new StringBuffer("abc"));

//程序开发分为编译时和运行时 得到方法要类型,调用得到的方法要同样类型的对象

Constructor constructor1=String.class.getConstructor(StringBuffer.class);//得到构造方法

//反射方法创建实例

// 编译器不知道返回的是String的构造方法

String str2=(String)constructor1.newInstance(new StringBuffer("abc"));

System.out.println(str2.charAt(2));

Class. newInstance():

//得到默认的构造方法, 用该构造方法创建实例(用到了缓存机制来保存默认构造方法的实例对象)

String obj=(String) String.class.newInstance();

class-->constructor-->new object变成class -->new object

反射导致性能下降

成员变量的反射

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

//成员变量的反射

ReflectPoint pt1=new ReflectPoint(3,5);

Field fieldy=pt1.getClass().getField("y");

//fieldy不是对象身上的变量,而是类上的变量

System.out.println(fieldy.get(pt1));

//x为私有,不可见

//Field fieldx=pt1.getClass().getField("x");

Field fieldx=pt1.getClass().getDeclaredField("x");

fieldx.setAccessible(true);//暴力反射

System.out.println(fieldx.get(pt1));

例:将任意一个对象中的所有String类型的成员变量所对应的字符串内容中的”b”改成”a”

private static void changeStringValue(Object obj) throws Exception{

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);

}

}

}

成员方法的反射

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

得到类中的某一个方法

Method methodCharAt=String.class.getMethod("charAt", int.class);

调用方法

//通常方式str1.chaAt(1);

//反射方式

System.out.println(methodCharAt.invoke(str1, 1));// JDK1.5

System.out.println(methodCharAt.invoke(str1, new Object []{2}));//JDK1.4

//静态方法

//System.out.println(methodCharAt.invoke(null, 1));

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

JDK1.5整个数组就是一个参数,JDK1.4数组中每一个元素对应一个参数

对接受数组参数的成员方法进行反射时会用JDK1.4

例:根据用户提供的类名,去执行该类的main方法

普通方法:

//TestArguments.main(new String[]{"11","22"});

反射方法:

//为什么要用反射?不知道类名,根据参数获得启动类名

String startingClassName=args[0];

Method  mainMethod=Class.forName(startingClassName).getMethod("main", String[].class);

//mainMethod.invoke(null,new String[]{"11","22"});

方法掉用一:mainMethod.invoke(null,new Object[]{ new String[]{"11","22"}});

方法掉用二:mainMethod.invoke(null, (Object)new String[]{"11","22"});

数组与Object的关系及其反射类型

数组反射的Class跟数组的维数和类型有关

具有相同维数和元素类型的数组属于同一个类型;

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

基本类型的一维数组可被当做Object类型使用,不可当做Object[]类型使用

非基本类型的一维数组可被当做Object类型使用,可当做Object[]类型使用

int [] a1=new int[]{1,2,3};

int [] a2=new int[4];

int [][] a3=new int[2][3];

String [] a4=new String []{"a","b","c"};

System.out.println(a1.getClass()==a2.getClass());//true

System.out.println(a1.getClass()==a4.getClass());//false

System.out.println(a1.getClass()==a3.getClass());//false

System.out.println(a1.getClass().getSuperclass().getName());

//java.lang.Object

System.out.println(a4.getClass().getSuperclass().getName());

Object aobj1=a1;

Object aobj2=a4;

//Object [] aobj3=a1;基本类型不是object

Object [] aobj4=a3;

Object [] aobj5=a4;

System.out.println(a1);

System.out.println(a4);

数组的反射应用

Array工具类用于完成对数组的反射操作

private static void printObject(Object obj) {

Class clazz=obj.getClass();

if(clazz.isArray()){

int len=Array.getLength(obj);

for(int i=0;i<len;i++){

System.out.println(Array.get(obj, i));

}

}else{

System.out.println(obj);

}

}

只能得到某一个元素的具体类型,不能得到整个数组的类型

Object[] a=new Object[]{"a",1};

System.out.println(a[0].getClass().getName());

转载于:https://www.cnblogs.com/niman/archive/2013/01/28/2880082.html

黑马程序员_java之反射相关推荐

  1. 黑马程序员_java高级篇网络编程TCP实战Day8(上)

    ---------------------ASP.Net+Android+IOS开发.Net培训.期待与您交流! ----------- 黑马程序员_java高级篇网络编程TCP实战Day8(上) ( ...

  2. 黑马程序员_java自学学习笔记(八)----网络编程

    黑马程序员_java自学学习笔记(八)----网络编程 android培训. java培训.期待与您交流! 网络编程对于很多的初学者来说,都是很向往的一种编程技能,但是很多的初学者却因为很长一段时间无 ...

  3. 黑马程序员_Java解析网络数据流的三种特殊方法

    Java解析网络数据流的三种特殊方法 Java作为最开放的语言,已越来越受到网络程序员的青睐.但这一青睐族有着同样的经历--曾经都为网络上通信的Java数据格式而烦恼. 笔者也不例外,曾经为此而查阅了 ...

  4. 黑马程序员_JAVA相关基础知识

    ------- android培训.java培训.期待与您交流! -------- JAVA相关基础知识 1.面向对象的特征有哪些方面 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便 ...

  5. 黑马程序员_Java基础Day05_面向对象之封装(Done)

    ------- android培训.java培训.期待与您交流! ---------- Day05开始接触到了Java核心部分--"面向对象". 面向对象是一种思考思想,是相对于早 ...

  6. 黑马程序员_Java高新技术3(框架,JavaBeans与内省(Introspector)) - 伊秋

    1.Java框架(frame) /* 通俗例子:我做房子(框架)卖给用户住,由用户自己安装门窗和空调(用户自定义类/用户自定义其它信息)用户需要使用我的房子(框架),把符合框架中结构的门窗插入进我提供 ...

  7. 黑马程序员_Java基础_前期准备02-1

    ---------------------------------------- JavaEE+云物联.期待与您交流!----------------------------------------- ...

  8. 黑马程序员-Java高新技术-反射

    ------- android培训. java培训.期待与您交流! ---------- 反射的基石→Class类 java程序中的各个java类属于同一类事物,描述这类事物的java类名就是Clas ...

  9. 黑马程序员_Java基础[16]_多态1

    ---------- android培训 . java培训 .期待与您交流! ---------- [[多态]] instanceof  定义:某一种事物的多种存在形态 [[instanceof  关 ...

最新文章

  1. 【新书】分布式强化学习
  2. 简单的java rpc_Java 简单的rpc 一
  3. 使用ros标定相机的内参和外参
  4. signature=4bfbf257ebc393e8ee3071d531b76778,(Mannose).
  5. scala中何时使用下划线_在Scala中使用下划线
  6. mkdir命令使用范例
  7. 前端学习(3328):闭包的形式3
  8. 蓝桥杯第八届省赛JAVA真题----最大公共子串
  9. 想做数学建模?先看看这些MATLAB函数吧!
  10. 内存泄漏的原因及解决办法_浅谈 JS 内存泄漏问题
  11. 从零开始入门单片机(一):必会背景知识总结
  12. widevine level1测试视频的生成方法
  13. 客户端提示“使用代理软件”并断网怎么解决?
  14. GIF微信表情如何制作
  15. 单像空间后方交会编程实现
  16. 【C++程序设计技巧】NVI(Non-Virtual Interface )
  17. 三星Galaxy S10可能把加密货币推向数百万名精通高兴技术的手机用户
  18. 官方微信支付跟特约商户的区别
  19. 《用户至上:用户研究方法与实践(原书第2版)》一3.1 概述
  20. java检验电话或传真_对有java开发过程 常用的js验证数字、电话号码、传真、邮箱、手机号码、邮编、日期...

热门文章

  1. opencv 模板匹配,在图像中寻找物体
  2. js系列教程12-浏览器存储全解
  3. matlab2c使用c++实现matlab函数系列教程-det函数
  4. Echarts数据可视化series-radar雷达图,开发全解+完美注释
  5. Eclipse代码自动补全设置
  6. padding卷积的两种方式“SAME”和“VALID”
  7. vivado下block design重新整理布局regenerate layout
  8. 实现加载页Loading Page 的几种方法
  9. 洛谷—— P1375 小猫
  10. BurpSuite 设置Hostname Resolution