java反射的基础学习代码
java反射的学习,好多东西不太理解,
主要分析了constructor,method,field,数组和调用main函数等反射的多个方面小例子。
主要的练习类
- package javaAdvanced;
- import java.lang.reflect.*;
- import java.util.Arrays;
- /**
- * 类的描述信息
- * 反射的练习
- *
- * @author cuiH
- * @since 1.5
- */
- public class ReflectTest {
- /**
- * 反射:将java中各个成分 映射到相应的java类上面
- * 就是说你想去到java类的一些信息,就需要用到反射。(类信息层面的控制)
- */
- public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException, NoSuchFieldException, ClassNotFoundException {
- //constructor类(构造方法的反射)
- Constructor constructor = String.class.getConstructor(StringBuffer.class);
- String strTest = (String) constructor.newInstance(new StringBuffer("cuiHuan")); //调用该方法时候也需要声明类型
- System.out.println(strTest.charAt(3)); //运行时刻该constructor对应的是StringBuffer, constructor在编译运行时刻进行转换,泛型进行约束
- /**
- * 作用,得到每个类的构造方法
- * 然后调用该方法下面的构造器
- * 正常情况下是:class——》constructor->new object
- * 使用constructor->调用 constructor,调用obj
- */
- //field类的使用(字段),反射调用字段
- ReflectPoint pt1 = new ReflectPoint(3, 5);
- Field fieldY = pt1.getClass().getField("y"); //得到字节码,得到field,field是类上的某个域,去取相应对象上的该域
- fieldY.get(pt1); //去到数值
- System.out.println(fieldY.get(pt1));
- /**
- * result:java.lang.NoSuchFieldException 若是getFiled访问私有方法时:报错没有改域
- * 对于私有需要用 getDeclaredField
- */
- Field fieldX = pt1.getClass().getDeclaredField("x");
- fieldX.setAccessible(true);
- System.out.println(fieldX.get(pt1));
- /**
- * result:java.lang.IllegalAccessException 提示非法错误,可以进行去到,但是仍然无法用,
- * 需要暴力输出:fieldX.setAccessible(true); 强制设定为可以进入(暴力进入)
- */
- //利用反射,进行对源程序进行修改。例如修改已经打完jar包的程序。
- changeStringValueBToA(pt1);
- Field[] fieldStr = pt1.getClass().getFields();
- System.out.println("b变为a更改后为:");
- for (Field field : fieldStr) {
- System.out.println(field.get(pt1));
- }
- //Method 类 反射调用方法 (方法调用方法,invoke调用该方法)
- Method methodCharAt = String.class.getMethod("charAt", int.class);
- methodCharAt.invoke(strTest, 3);
- System.out.println(methodCharAt.invoke(strTest, 3));
- /**
- * 获取方法(踩刹车)
- * 调用方法(刹车调用停车的方法),面向对象的设计
- * 相当于获取了静态方法,静态引入
- * 注意jdk1.4之前没有可变参数,
- */
- System.out.println(methodCharAt.invoke(strTest, new Object[]{3}));//jdk 1.4的做法,声明一个数组来代替可变参数(原始方法)
- TestArguments.main(new String[]{"cuiHuan", "like", "java"}); //调用main方法,原有的静态的调用方法
- String className = "javaAdvanced.TestArguments";
- Method mainMethod = Class.forName(className).getMethod("main", String[].class);
- mainMethod.invoke(null, new Object[]{new String[]{"cuiHuan", "like", "java"}});
- //数组的反射
- int[] a1 = new int[]{2, 1, 3};
- int[] a2 = new int[4];
- int[][] a3 = new int[2][3];
- String[] a5 = new String[2];
- String[] a6 = new String[3];
- String[] a4 = new String[]{"a", "b", "c"};
- System.out.println("数组比较:" + (a1 == a2)); //没有赋值之前为 true ;赋值之后为false
- System.out.println("String比较:" + (a5 == a6)); //没有赋值之前为 true ;赋值之后为false
- System.out.println("a1字节码的名字:" + a1.getClass().getName());
- System.out.println("a2字节码的名字:" + a2.getClass().getName());
- System.out.println("数组字节码比较:" + (a1.getClass() == a2.getClass())); //说明用的是一个字节码
- System.out.println("一维数组的父类的字节吗的名字:" + a1.getClass().getSuperclass().getName()); //数组的父类是obj
- System.out.println("二维数组的父类的字节吗的名字:" + a3.getClass().getSuperclass().getName()); //数组的父类是obj
- System.out.println("String的父类的字节吗的名字:" + a4.getClass().getSuperclass().getName()); //数组的父类是obj
- Object obj1 = a1; //数组其实是一个对象
- Object obj2 = a4;
- Object[] obj3 = a4; //二维数组其实是一组对象
- Object[] obj4 = a3;
- System.out.println("直接输出a1:" + a1); //result: 直接输出a1:[I@16c9ba38 类型为I(int) 具体数值为@16c9ba38
- System.out.println("输出为string的a1:" + Arrays.toString(a1)); //result:输出为string的a1:[2, 1, 3]
- System.out.println("输出为list的a1:" + Arrays.asList(a1)); //result: 输出为list的a1:[[I@15e0be38] 证书看做了一个参数(相当于一个obj)
- System.out.println("直接输出数组:" + a4); //result:直接输出数组: [Ljava.lang.String;@95c7850
- System.out.println("输出为list的a1:" + Arrays.asList(a4)); //字符串可以成功转换为Llist
- /** http://www.cnblogs.com/sosoft/
- * 之前可以发现,数组的本质一个对象,二维相当于一组对象,对于asList获取的是对象的地址
- * 当数组或者String没有初始化之前,他们共用一个字节码。(object)
- *
- * 数组反射的应用
- * 现在如果要改变数组的其中一个元素
- */
- System.out.println("数组反射的应用:打印数组中的每个元素");
- printObject(new int[]{2, 1, 3}); //result:2 1 3
- printObject(new int[4]); //result: 0 0 0 0 默认数值都是0
- printObject("String"); //result:String
- }
- //打印数组的函数
- private static void printObject(Object obj) {
- Class cls = obj.getClass();
- if (cls.isArray()) {
- int length = Array.getLength(obj);
- for (int i = 0; i < length; i++) {
- System.out.print(Array.get(obj, i) + " ");
- }
- } else {
- System.out.println(obj);
- }
- }
- //有许多String类型,将所有String中的b 变为 a
- private static void changeStringValueBToA(Object obj) throws IllegalAccessException {
- Field[] fields = obj.getClass().getFields();
- for (Field field : fields) {
- //判定是String的字节码
- if (field.getType() == (String.class)) { //字节码最好不用Equals比 较,双等号比较好,因为字节码只有一个,唯一
- String oldValue = (String) field.get(obj);
- String newValue = oldValue.replace('b', 'a');
- field.set(obj, newValue);
- }
- }
- }
- }
- //写一个方法,调用main方法
- class TestArguments {
- public static void main(String[] args) {
- for (String arg : args) {
- System.out.println(arg);
- }
- }
- }
用到的一个java类:
- package javaAdvanced;
- /**
- * 类的描述信息
- * 反射信息的测试类
- * http://www.cnblogs.com/sosoft/
- * @author cuiH
- * Date: 13-12-2
- */
- public class ReflectPoint {
- private int x;
- public int y;
- public String str1 = "football";
- public String str2 = "basketball";
- public String str3 = "pingPang";
- public ReflectPoint(int x, int y) {
- this.x = x;
- this.y = y;
- }
- @Override
- public String toString() {
- return super.toString();
- }
- @Override
- public boolean equals(Object o) {
- if (this == o) return true;
- if (!(o instanceof ReflectPoint)) return false;
- ReflectPoint that = (ReflectPoint) o;
- if (x != that.x) return false;
- if (y != that.y) return false;
- return true;
- }
- @Override
- public int hashCode() {
- int result = x;
- result = 31 * result + y;
- return result;
- }
- }
java反射的基础学习代码的更多相关文章
- java网络爬虫基础学习(三)
尝试直接请求URL获取资源 豆瓣电影 https://movie.douban.com/explore#!type=movie&tag=%E7%83%AD%E9%97%A8&sort= ...
- Java反射机制的学习
Java反射机制是Java语言被视为准动态语言的关键性质.Java反射机制的核心就是允许在运行时通过Java Reflection APIs来取得已知名字的class类的相关信息,动态地生成此类,并调 ...
- Java反射:Web学习的灵魂
反射:Web学习的灵魂 我们从最初的 javac -HelloWorld.java,到面向对象部分,我们可以将Java代码在计算机中经历的阶段分为三部分:Scource源代码阶段 -- Class类对 ...
- java反射机制(基础版)
package com.reflect; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import ja ...
- java反射机制基础
java反射机制: JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和 属性:这种动态获取信息以及动态调用对象方法的功能称为j ...
- java网络爬虫基础学习(一)
刚开始接触java爬虫,在这里是搜索网上做一些理论知识的总结 主要参考文章:gitchat 的java 网络爬虫基础入门,好像要付费,也不贵,感觉内容对新手很友好. 一.爬虫介绍 网络爬虫是一个自动提 ...
- Java反射机制集中学习
什么是反射 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象方法的功能称为java语言 ...
- java反射机制基础总结
1反射机制是啥? 反射是运行中的程序检查自己和软件运行环境的能力,它可以根据它发现的进行改变.通俗的讲就是反射可以在运行时根据指定的类名获得类的信息. 2反射机制有啥用? Reflection(反射) ...
- Java基础学习-代码块
/*代码块: * 用{}修饰的代码 * 1.局部代码块:控制变量,存在方法中,控制变量的生命周期(作用域) * 2.构造代码块:提取构造方法中的共性,每次创建对象,都会执行,并且在构造方法执行之前执行 ...
随机推荐
- AT&T Assembly on Linux
je if equal then jmp jg if the second gt the first, then jmp jge if the second ge the first, then jm ...
- mongodb java spring data
关于如何集成spring-data-mongodb到项目中,已经有很多人介绍了,这里只给出几个链接. GETTING STARTED Accessing Data with MongoDB: http ...
- EF架构~关于多对多关系表无法更新与插入的问题
回到目录 在EF里,我们设计模型时,会设计到多对多关系,在EF里会把这种关系会转成两个一对多的关系表,这是比较友好的,因为多对多来说,对于业务本身没什么意思,所以隐藏了,没什么坏处,但对于这个隐藏来说 ...
- Linux下chkconfig命令详解 这个简单明了啊
chkconfig命令主要用来更新(启动或停止)和查询系统服务的运行级信息.谨记chkconfig不是立即自动禁止或激活一个服务,它只是简单的改变了符号连接. 使用语法:chkconfig [--ad ...
- javascript_core_01之数据类型与运算
1.数据类型转换: ①隐式转换:程序根据需要,自动转化数据类型: ②强制转换:主动调用函数执行转换: 2.字符串强制转换: ①x.toString():不能转换null和undefined: ②Str ...
- android sdk下载
android sdk下载 所有的离线包都有 http://mirrors.neusoft.edu.cn/android/repository/
- 使用SSIS进行数据清洗
简介 OLTP系统的后端关系数据库用于存储不同种类的数据,理论上来讲,数据库中每一列的值都有其所代表的特定含义,数据也应该在存入数据库之前进行规范化处理,比如说"age"列 ...
- Netbeans不能正常启动glassfish或者部署失败不能运行的问题
错误信息:D:\临时文件\netbeans\WebTest\build\web中部署GlassFish Server 4, deploy, Connection refused: connect, f ...
- 分享几个asp.net开发中的小技巧
下面这几个,是在实际开发或阅读中发现的一些问题,有些甚至是有很多年开发人员写出的代码,也是很多人经常犯的错误.各位可以看看,你有没有躺着中枪. 第一个,对整型变量进行非null判断. // a 是in ...
- 后端码农谈前端(CSS篇)第四课:选择器补充(伪类与伪元素)
一.伪类: 属性 描述 :active 向被激活的元素添加样式. :focus 向拥有键盘输入焦点的元素添加样式. :hover 当鼠标悬浮在元素上方时,向元素添加样式. :link 向未被访问的链接 ...