------- android培训、 java培训、期待与您交流! ----------

反射的基石→Class类

java程序中的各个java类属于同一类事物,描述这类事物的java类名就是Class。

例如 : 人用Person类来表示 ,而java类就用Class来表示

当用到一个类的时候,就是去硬盘上将.class文件(二进制) 加载到内存中来(在内存中就是一段字节码)
 而这段字节码就是Class的实际对象
例如  Class cl=Date.class;//字节码

如何获取各个字节码对应的实例对象(Class)

1 类名.class  例如 Class p=Person.class;  //1和2 都是该类加载到内存中了,内存中有这份字节码,

2 对象.getClass 例如 p.getClass();        // 直接获取

3 Class.forName("类名");  例如 Class.forName("java.lang.String");

3 就是还没有用到String类,内存中没有这份字节码,forName("类名"); 就是类加载器,将该类加载到内存中,并返回(获取)该类的字节码对象,

九大原始数据类型有什么

8个引用数据类型+void类型,  Class in=int.Calss;   Class in1=Integer.TYPE;

in==in1; ture

判断谋一份字节码是不是原始数据类型

字节码对象.isPrimtive(); 判断下该字节码是不是预定义(原始)类型

判断某一份字节码是不是数组类型

字节码对象.isArray();

通过该类对象
   getName();获取类的名字
  Package getPackage()  ; 获取该类所属的包
  Class[] getInterfaces() ;确定此对象所表示的类或接口实现的接口。

........

---------------------------------------------------------------------------

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

java类的Class类显然要提供一系列的方法,来获取其中的变量,方法,构造函数,修饰符,包等信息,

这些信息就是用相应的实例对象来表示,它们是Field,Method,Contructor,Package等等

构造方法: 通过这个 new String(new StringBuffer("abc")); 构造方法创建一个String对象值为abc

Constructor constructor1=String.class.getConstructor(StringBuffer.class);  //获取指定的构造方法

String str=(String)constructor1.newInstance(new StringBuffer("abc"));   //创建成功

String str=(String)constructor1.newInstance("abc");//创建失败,需要StringBuffer类型参数,传进来的却是String类型的参数,导致参数类型不匹配,报错

首先注意,传递进去一个构造函数需要的参数,才能创建对象,记住强转类型

Class类也有newInstance()方法     获取没有参数的构造方法, 下面例子String s="";

String s=(String)Class.forName("java.lang.String").newInstance();

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

public class JieDian {
 public int x;
 private int y;
 public JieDian(int x, int y) {
  super();
  this.x = x;
  this.y = y;
 }
}

public static void main(String[] args) throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException {
  // TODO Auto-generated method stub
  JieDian jd=new JieDian(3,6);
  Field fieldx=jd.getClass().getField("x"); //获取类字节码中变量x的字节码
  System.out.println(fieldx.get(jd));    //打印这份字节码在指定对象上的对应值
  Field fieldy=jd.getClass().getDeclaredField("y"); //获取类字节码中私有变量y的字节码
  fieldy.setAccessible(true); //暴力反射,可以被访问(返回)
  System.out.println(fieldy.get(jd));
 }

把一个类中的所有Sting变量    将变量值中的‘a’被‘b’代替

Field[] fieldd=jd.getClass().getDeclaredFields();
  for(Field fielda : fieldd)      //遍历所有的变量
  {
   if(fielda.getType()==String.class)     //看看是不是String类型
   {   // ==号,因为String的字节码只有一份
    String oldStr=(String)fielda.get(jd);   //获取在该对象中的String的值
    String newStr=oldStr.replace('a', 'b');  //字符替换
    fielda.set(jd, newStr);               // 将该对象的值替换成新对象的
   }
  }
  System.out.println(jd.s);       //值被改变
  System.out.println(jd.ss);      //值被改变

反射运行方法

String s="abc";  得到类中某个方法           //获取String类中的charAt方法,int.class为需要的参数
  Method mt=String.class.getMethod("charAt", int.class);  
  System.out.println(mt.invoke(s, 2));  //然后这个方法在那个对象上的值打印

***如果传递给Method对象的invoke()方法第一个参数为null,那么该方法一定是静态的

反射运行某个类的mian()方法

public static void main(String[] args) throws SecurityException, NoSuchMethodException, ClassNotFoundException, IllegalArgumentException, IllegalAccessException, InvocationTargetException {
  String s="jdk_5.Text_2";   //src下某个包下的某个类
  Method  mt=Class.forName(s).getMethod("main",String[].class);  //加载该类,获取main方法
  mt.invoke(null, (Object)new String[]{"11","22","33"});   // 通过反射运行mian方法

}                 //为了兼容jdk1.4,这必须为一个对象

读取配置文件,获取类名。new出对象

InputStream ip=new FileInputStream("config.properties");  //读取配置文件
  Properties pt=new Properties();   // 创建集合
  pt.load(ip);                    //加载配置文件
  ip.close();                      
  String className=pt.getProperty("className"); //根据键获取值
  Collection ct=(Collection) Class.forName(className).newInstance();  //创建对象(Arraylist集合)
  int a=22;            String s="sadasd";
  ct.add(s);           ct.add(a);
  System.out.println(ct.size());   //长度 2

黑马程序员-Java高新技术-反射相关推荐

  1. 黑马程序员JAVA高新技术(一)

    ------- android培训.java培训.期待与您交流! ---------- 静态导入 普通import导入一个类或者是某个包中的所有类 Import static 静态导入 导入类下的一个 ...

  2. 黑马程序员-java高新技术-代理和类加载器

    ------- android培训. java培训.期待与您交流! ---------- 代理模式:为其他对象提供一种代理以控制对这个对象的访问.说白了就是,在一些情况下客户不想或不能直接引一个对象, ...

  3. 黑马程序员——Java高新技术枚举和自动装箱

       android培训.java培训.期待与您交流!   枚举类和自动包装      一.枚举       枚举由不重复的常量构成,在java中使用enmu关键字定义枚举,所有的枚举会自动继承jav ...

  4. 黑马程序员Java零基础视频教程_下部(P135-P200)

    黑马程序员Java零基础视频教程_下部(P135-P200) 1 多线程 1.1 什么是多线程? 1.2 多线程的并发与并行 1.3 多线程的实现方式 1.3.1 继承Thread类的方式进行实现 1 ...

  5. 黑马 程序员——Java基础---流程控制

    黑马程序员--Java基础---流程控制 ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------ 一.概述 Java提供了两种基本的流程控制结构:分支结构 ...

  6. 黑马 程序员——Java基础---IO(下)

    黑马程序员--Java基础---IO(下) ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------ 一.概述 Java除了基本的字节流.字符流之外,还提供 ...

  7. 2023年黑马程序员Java学习路线图

    2023年Java学科免费学习资源放送40+套课程,超过600小时的内容! 在过去的一年里,为了帮助更多人线上充电,学会更多技能,黑马程序员举办了 150+ 场免费直播公开课,新增精品视频教程 80+ ...

  8. 黑马程序员Java教程学习笔记(五)

    学习视频:https://www.bilibili.com/video/BV1Cv411372m 如侵权,请私信联系本人删除 文章目录 黑马程序员Java教程学习笔记(五) 日期时间:Date.Sim ...

  9. 黑马程序员 JAVA WEB 第三节 MYSQL 约束

    这是阿锃总结的第三节黑马程序员JAVA WEB视频的MYSQL约束部分的笔记.希望可以帮助跟我一样正在学习Java web的同学们.我们一起进步.   b_d 若果有同学也想学习黑马程序员Java w ...

最新文章

  1. 网路游侠:某软件版WEB应用防火墙试用
  2. R语言DALEX包的model_profile函数对caret包生成的多个算法模型的连续变量进行分析、使用Acumulated Local Effects (ALE)方法解释某个连续特征和目标值关系
  3. linux c sysconf函数 得到系统配置
  4. ABAP report的递归submit和在虚拟机里再次启动另一个虚拟机
  5. linux eclipse 关联源码,获取Hadoop的源码和通过Eclipse关联Hadoop的源码
  6. centos php7 apcu,centos php5.4 升级 php7
  7. COM, COM+ and .NET 的区别
  8. beego——模板处理
  9. 【LeetCode笔记 - 每日一题】519. 随机翻转矩阵(Java、随机、双指针)
  10. 一维数组去重处理法二(C语言)
  11. android获取app内存信息,Android 获取内存信息(RAM,ROM)
  12. MATLAB中的fopen、fclose、fprintf、fscanf、fread、fwrite
  13. salt 源码之 salt-minion启动过程
  14. VFP9 连接mysql代码示例
  15. Go:HTTP长连接
  16. dh模型表matlab,建立DH模型的三种方法以及区别
  17. 卡巴斯基联手功夫巨星成龙 五月鸟巢开唱
  18. 【名词一】Vortex和Vorticity和Circulation和Kelvin‘s circulation theorem
  19. html控制图的宽,【公差的验收控制图】 过程稳定与控制图傻傻分不清
  20. W32 - 999、综合扫描及安全评估

热门文章

  1. (一)GNURadio3.9 安装教程
  2. feko 2017安装包
  3. 11月8日赢在淘宝 北京站ISV聚会笔记
  4. BIM技术为什么广泛应用于地铁工程项目上?
  5. 全国青少年软件编程等级考试内容,知识点思维导图(Scratch编程一级)
  6. Elasticsearch教程(17) 返回结果过滤 _source_includes和_source_excludes使用
  7. 针对间接分支的比特级感知预测器BLBP “Bit-level Perceptron Prediction for Indirect Branches”(2019 ISCA)
  8. 24Bit LVDS中的JEIDA和VESA标准差异
  9. matlab中变压器电感基值公式,基于MATLAB的变压器短路阻抗计算.pdf
  10. win8如何锁定计算机,Win8教程 5种方法告诉你Win8如何关机