黑马程序员-Java高新技术-反射
------- 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高新技术-反射相关推荐
- 黑马程序员JAVA高新技术(一)
------- android培训.java培训.期待与您交流! ---------- 静态导入 普通import导入一个类或者是某个包中的所有类 Import static 静态导入 导入类下的一个 ...
- 黑马程序员-java高新技术-代理和类加载器
------- android培训. java培训.期待与您交流! ---------- 代理模式:为其他对象提供一种代理以控制对这个对象的访问.说白了就是,在一些情况下客户不想或不能直接引一个对象, ...
- 黑马程序员——Java高新技术枚举和自动装箱
android培训.java培训.期待与您交流! 枚举类和自动包装 一.枚举 枚举由不重复的常量构成,在java中使用enmu关键字定义枚举,所有的枚举会自动继承jav ...
- 黑马程序员Java零基础视频教程_下部(P135-P200)
黑马程序员Java零基础视频教程_下部(P135-P200) 1 多线程 1.1 什么是多线程? 1.2 多线程的并发与并行 1.3 多线程的实现方式 1.3.1 继承Thread类的方式进行实现 1 ...
- 黑马 程序员——Java基础---流程控制
黑马程序员--Java基础---流程控制 ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------ 一.概述 Java提供了两种基本的流程控制结构:分支结构 ...
- 黑马 程序员——Java基础---IO(下)
黑马程序员--Java基础---IO(下) ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------ 一.概述 Java除了基本的字节流.字符流之外,还提供 ...
- 2023年黑马程序员Java学习路线图
2023年Java学科免费学习资源放送40+套课程,超过600小时的内容! 在过去的一年里,为了帮助更多人线上充电,学会更多技能,黑马程序员举办了 150+ 场免费直播公开课,新增精品视频教程 80+ ...
- 黑马程序员Java教程学习笔记(五)
学习视频:https://www.bilibili.com/video/BV1Cv411372m 如侵权,请私信联系本人删除 文章目录 黑马程序员Java教程学习笔记(五) 日期时间:Date.Sim ...
- 黑马程序员 JAVA WEB 第三节 MYSQL 约束
这是阿锃总结的第三节黑马程序员JAVA WEB视频的MYSQL约束部分的笔记.希望可以帮助跟我一样正在学习Java web的同学们.我们一起进步. b_d 若果有同学也想学习黑马程序员Java w ...
最新文章
- 网路游侠:某软件版WEB应用防火墙试用
- R语言DALEX包的model_profile函数对caret包生成的多个算法模型的连续变量进行分析、使用Acumulated Local Effects (ALE)方法解释某个连续特征和目标值关系
- linux c sysconf函数 得到系统配置
- ABAP report的递归submit和在虚拟机里再次启动另一个虚拟机
- linux eclipse 关联源码,获取Hadoop的源码和通过Eclipse关联Hadoop的源码
- centos php7 apcu,centos php5.4 升级 php7
- COM, COM+ and .NET 的区别
- beego——模板处理
- 【LeetCode笔记 - 每日一题】519. 随机翻转矩阵(Java、随机、双指针)
- 一维数组去重处理法二(C语言)
- android获取app内存信息,Android 获取内存信息(RAM,ROM)
- MATLAB中的fopen、fclose、fprintf、fscanf、fread、fwrite
- salt 源码之 salt-minion启动过程
- VFP9 连接mysql代码示例
- Go:HTTP长连接
- dh模型表matlab,建立DH模型的三种方法以及区别
- 卡巴斯基联手功夫巨星成龙 五月鸟巢开唱
- 【名词一】Vortex和Vorticity和Circulation和Kelvin‘s circulation theorem
- html控制图的宽,【公差的验收控制图】 过程稳定与控制图傻傻分不清
- W32 - 999、综合扫描及安全评估
热门文章
- (一)GNURadio3.9 安装教程
- feko 2017安装包
- 11月8日赢在淘宝 北京站ISV聚会笔记
- BIM技术为什么广泛应用于地铁工程项目上?
- 全国青少年软件编程等级考试内容,知识点思维导图(Scratch编程一级)
- Elasticsearch教程(17) 返回结果过滤 _source_includes和_source_excludes使用
- 针对间接分支的比特级感知预测器BLBP “Bit-level Perceptron Prediction for Indirect Branches”(2019 ISCA)
- 24Bit LVDS中的JEIDA和VESA标准差异
- matlab中变压器电感基值公式,基于MATLAB的变压器短路阻抗计算.pdf
- win8如何锁定计算机,Win8教程 5种方法告诉你Win8如何关机