loading黑马程序员之高级编程:反射(4-2)
来源:互联网 发布:php json true false 编辑:程序博客网 时间:2024/05/21 20:26
-------android培训 、java培训、期待与您交流! ----------
Java 反射API的第一个主要作用是获取程序在运行时刻的内部结构。这对于程序的检查工具和调试器来说,是非常实用的功能。只需要短短的十几行代码,就可以遍历出来一个Java类的内部结构,包括其中的构造方法、声明的域和定义的方法等。这不得不说是一个很强大的能力。只要有了java.lang.Class类 的对象,就可以通过其中的方法来获取到该类中的构造方法、域和方法。对应的方法分别是getConstructor、getField和getMethod。这三个方法还有相应的getDeclaredXXX版本,区别在于getDeclaredXXX版本的方法只会获取该类自身所声明的元素,而不会考虑继承下来的。Constructor、Field和Method这三个类分别表示类中的构造方法、域和方法。这些类中的方法可以获取到所对应结构的元数据。
反射API的另外一个作用是在运行时刻对一个Java对象进行操作。 这些操作包括动态创建一个Java类的对象,获取某个域的值以及调用某个方法。在Java源代码中编写的对类和对象的操作,都可以在运行时刻通过反射API来实现。
基类:
package com.heima.reflection;public class ReflectPoint {private int x;public int y;private String a = "a";public String b = "b";public String c = "ch";public ReflectPoint(int x, int y) {this.x = x;this.y = y;}public ReflectPoint(String a, String b) {this.a = a;this.b = b;}public String toString(){return "a="+this.getA()+"\t b="+this.getB()+"\t c="+this.getC();}@Overridepublic int hashCode() {final int prime = 31;int result = 1;result = prime * result + x;result = prime * result + y;return result;}@Overridepublic boolean equals(Object obj) {if (this == obj)return true;if (obj == null)return false;if (getClass() != obj.getClass())return false;ReflectPoint other = (ReflectPoint) obj;if (x != other.x)return false;if (y != other.y)return false;return true;}public int getX() {return x;}public void setX(int x) {this.x = x;}public int getY() {return y;}public void setY(int y) {this.y = y;}public String getA() {return a;}public void setA(String a) {this.a = a;}public String getB() {return b;}public void setB(String b) {this.b = b;}public String getC() {return c;}public void setC(String c) {this.c = c;}}
字段Demo:
package com.heima.reflection;import java.lang.reflect.Constructor;import java.lang.reflect.Field;public class FieldDemo {public static void main(String[] args) throws Exception {Constructor<ReflectPoint> constructor = ReflectPoint.class.getConstructor(int.class,int.class);ReflectPoint point = constructor.newInstance(3,5);//field不是对象的变量,而是类的//getField只能拿到类中的非private成员Field fieldy = point.getClass().getField("y");System.out.println(fieldy.get(point));//getDeclaredField:暴力反射//看见了,拿不到Field fieldx = point.getClass().getDeclaredField("x");//拿到了fieldx.setAccessible(true);System.out.println(fieldx.get(point));}}
方法Demo:
package com.heima.reflection;import java.lang.reflect.Method;public class MethodDemo {public static void main(String[] args) throws Exception{String str = "reflection method";Method method = String.class.getMethod("charAt", int.class);//method.invoke(null, 0):没有对象,那method就是静态方法咯System.out.println(method.invoke(str, 0));System.out.println(method.invoke(str, new Object[]{1}));//jdk5.0以前的invoke方法,向下兼容}}
构造函数Demo:
package com.heima.reflection;import java.lang.reflect.Constructor;/** * 快捷键:alt+shift+字母:eclipse菜单栏 * 反射:把Java类中的各个组件映射成相应的Java类 * Class是一个类,Field,method,等也是一个类 *反射很耗内存 */public class ConstructorDemo {public static void main(String[] args) throws Exception {//JDK5.0新特性:可变参数;5.0以前用的是数组Constructor<String> con = String.class.getConstructor(StringBuilder.class);System.out.println(con.getDeclaringClass());//1.正常创建对象String str1 = new String(new StringBuilder("normal"));//2.反射创建对象String str2 = con.newInstance(new StringBuilder("reflect"));//3.得到默认构造函数:缓存机制来保存默认构造函数的实例对象String str3 = String.class.newInstance();}}
练习:
package com.heima.reflection;import java.lang.reflect.Field;/** * 变量的综合应用 * */public class practice {public static void main(String[] args) throws Exception {ReflectPoint point = new ReflectPoint("applyb", "beara");changeStringValue(point);System.out.println(point.toString());}/** * 改变任意一个对象中所有String类型的值,把所有a改成b * @param obj * @throws Exception */public static void changeStringValue(Object obj) throws Exception {// 1.得到所有声明的字段,包括private的Field[] fields = obj.getClass().getDeclaredFields();// 2.过滤String类型的字段for (Field f : fields) {f.setAccessible(true); // 暴力反射:可以得到私有成员// 字节码只有一份if (f.getType() == String.class) {// 3.改变值String value = (String) f.get(obj);value = value.replace("a", "b");f.set(obj, value);}}}}
-------android培训 、java培训、期待与您交流! ----------
0 0
- loading黑马程序员之高级编程:反射(4-2)
- loading黑马程序员之高级编程:代理(4-4)
- loading黑马程序员之高级编程:枚举(4-1)
- loading黑马程序员之高级编程:泛型(4-3)
- loading黑马程序员之网络编程:文件传输(3-2)
- loading黑马程序员之IOFile(2-4)
- loading黑马程序员之网络编程:聊天(3-1)
- 黑马程序员 java高级技术1.5之反射(张孝祥)
- 黑马程序员----JAVASE高级部分之反射
- 黑马程序员---高级-反射
- loading黑马程序员之IO字节流(2-2)
- loading黑马程序员之IO字符流(2-1)
- loading黑马程序员之IO键盘输入(2-3)
- loading黑马程序员之银行业务调度系统(5-2)
- 黑马程序员--Java编程之反射篇
- 黑马程序员之反射2
- 黑马程序员-Java高级:反射
- 黑马程序员——反射高级应用之动态代理
- 泛型趣谈
- Java 单例模式探讨
- Beyond Compare文件比较器
- OpenCV学习笔记(二)——新版本模块结构
- JAVA swing.JFrame 的屏幕居中代码
- loading黑马程序员之高级编程:反射(4-2)
- Puppet vs. Chef vs. Ansible vs. Salt 评分
- Corner detection
- java 泛型详解
- 表单中只有一个文本框时,回车页面刷新错误
- Java剖析工具JProfiler入门使用教程:查找内存泄漏的方法
- SAS学习笔记
- HDU 3336Count the string
- Newtonsoft.Json 使用