黑马程序员_高新技术-反射
来源:互联网 发布:金融行业java面试题 编辑:程序博客网 时间:2024/04/29 08:04
反射就 是把java类中的各种成分映射成相应的java类 。
Constructor
Method
Field
Package等等这些类代表的是字节码文件中的构造函数,字段,方法,包.。
用反射获取构造方法
Constructor constructor=String.class.getConstructor(StringBuffer.class);
用构造方法获取实例化对象
String str=(String)constructor.newInstance(new StringBuffer("aaaa"));
用Class中的newInstance获取实例化对象
String str1=String.class.newInstance();
Field
private static void changeStringValue(Object obj)throws Exception { // TODO Auto-generated method stub Field[] fields = obj.getClass().getFields(); for (Field field : fields) { //在这里用==比较确切,因为字节码文件在内存中只存在一份,所以用==比equals方法更合适 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); System.out.println(methodCharAt.invoke(str, 2));
invoke方法的第一人参数是对象,如果为null那么这个Method对象对应的是一个静态方法。
jdk1.4和jdk1.5中invoke方法的区别:
在方法中如果有参数是数组,1.5中是可变参数,1.4中是数组。
在传入的参数是数组时,在1.5中是Object类型的可变参数,而在1.4中是Object类型的数组。
如 public static void main(String[] args),要接收的是一个String类型的数组,而public static void main(String... args),要接收的是n个String类型的对象。
所以为了兼容1.4。我们在写程序的时候传入参数时,应该传一个数组而在1.5中编译器会将数组打开以可变参数的形式接收这个数组。所以在传入一个数组后,编译器会将数组打开,把打开后的每一个元素分别作为一个参数进行操作。这样在1.4中就会出现问题,因为将数组打开后的元素,就不再是这个方法要的参数,程序就会出错。那么我们可以将要传入的数组再封装到一个Object数组中,即mainMethod.invoke(null, new Object[]{new String[]{"111","222","3333"}});这样在打开这个数组之后,还是一个数组,就可以按照我们的思想把数组传递进去。或者将其转换成Objcet类型的数组,即mainMethod.invoke(null, (Object)new String[]{"111","222","3333"});这样是把String数组对象转换成了一个Object对象,就是告诉编译器,我传入的是一个对象不是一个数组,不需要打开。
数组的反射
int[] a1=new int[]{1,2,3,4}; int[] a2=new int[3]; int[][] a3=new int[2][3]; String[] a4=new String[]{"a","b","c"}; System.out.println(a1.getClass()==a2.getClass()); //System.out.println(a1.getClass()==a3.getClass()); //System.out.println(a1.getClass()==a4.getClass()); System.out.println(a1.getClass().getName()); System.out.println(a3.getClass().getName()); System.out.println(a4.getClass().getName()); System.out.println(a1.getClass().getSuperclass().getName()); System.out.println(a3.getClass().getSuperclass().getName()); System.out.println(a4.getClass().getSuperclass().getName()); Object aobj1=a1; Object aobj2=a3; Object aobj3=a4; //Object[] aobj4=a1;//基本数据类型不是Object类 Object[] aobj5=a3; Object[] aobj6=a4; System.out.println(Arrays.asList(a1,a4)); System.out.println(Arrays.asList(a1)); System.out.println(Arrays.asList(a4)); Array是对数组进行反射的类private static void printObject(Object obj) { // TODO Auto-generated method stub Class clazz=obj.getClass(); if (clazz.isArray()) { int len=Array.getLength(obj); System.out.print("["); for (int i = 0; i < len; i++) { if(i<len-1) System.out.print(Array.get(obj, i)+", "); else System.out.println(Array.get(obj, i)+"]"); } } else { System.out.println(obj); } }
反射的应用
一般在做框架的时候用
package cn.itcast.day1;import java.io.FileInputStream;import java.io.InputStream;import java.util.ArrayList;import java.util.Collection;import java.util.HashSet;import java.util.Properties;public class ReflectTest2 { /** * @param args */ public static void main(String[] args)throws Exception { // TODO Auto-generated method stub //InputStream ips=new FileInputStream("src/cn/itcast/day1/config.properties"); //只能读取配置文件 //InputStream ips=ReflectTest2.class.getClassLoader().getResourceAsStream("resourse/config.properties"); InputStream ips=ReflectTest2.class.getResourceAsStream("resourse/config.properties"); Properties props=new Properties(); props.load(ips); ips.close(); String className=props.getProperty("className"); Collection collection=(Collection)Class.forName(className).newInstance(); ReflectPoint pt1=new ReflectPoint(3, 5); ReflectPoint pt2=new ReflectPoint(3, 3); ReflectPoint pt3=new ReflectPoint(3, 3); collection.add(pt1); collection.add(pt2); collection.add(pt3); System.out.println(collection.size()); }}
- 黑马程序员_高新技术------反射
- 黑马程序员_高新技术-反射
- 黑马程序员_高新技术_反射
- 黑马程序员_高新技术_反射
- 黑马程序员_Java高新技术二_反射
- 黑马程序员_Java高新技术_反射
- 黑马程序员_高新技术之反射
- 黑马程序员_高新技术之反射
- 黑马程序员_高新技术Java反射机制
- 黑马程序员_Java高新技术_反射
- 黑马程序员_高新技术:4) 注解、反射
- 黑马程序员_高新技术之反射
- 黑马程序员—JAVA高新技术_反射
- 黑马程序员—高新技术_反射(1)
- 黑马程序员—高新技术_反射(2)
- 黑马程序员-高新技术-反射
- 黑马程序员 高新技术---反射
- 黑马程序员-高新技术-反射
- php常用的四种排序算法
- dhcp和bootp协议的区别
- hdu 1702 栈和队列的简单应用
- 使用ZBarSDK生成和读取二维码
- 自己写的strcamp函数不知道哪里错了
- 黑马程序员_高新技术-反射
- Syntax error: word unexpected (expecting ")")
- 求素数方法
- 国内千万级手机端视频互动娱乐直播完整源码
- C++ 回调函数与函数指针
- 模式识别: 线性分类器
- 晒晒我写的折半插入排序算法
- Graph Cuts学习笔记2014.5.16----1
- 图像处理程序框架—MFC相关知识点