黑马程序员-高新反射学习日记
2014-04-23 01:04
344 查看
.---------------------- <a href="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a>、<a href="http://www.itheima.com"target="blank">.Net培训</a>、期待与您交流! ---------------------- 反射基石 ->Class类 用来描述JAVA类的类就是Class 类被加载到内存后的内容就是字节码。这些字节码被存储的空间被对象来表示,这些对象也存在类型,这种类型就是Class类型。 Person p1 = new Person(); Person p2 = new Person(); Class clas1 = Person.Class; = 字节码 Class clas2 = p1.getClass(); = 字节码 Class.forName("java.lang.String"); 查询或者加载字符串所对应类的字节码。 反射: 就是把JAVA类中的各种成分映射成JAVA类 Constructor类代表某个类中的一个构造方法 String.class.getconstructor(StringBuffer.class) 得到一个构造方法 通过参数类型去获取构造方法的字节码 调用获得的方法时要注意转换类型 Field类:代表某个类中的一个成员变量 RelectPoint ref = new RelectPoint(3,5); Field fiy = ref.getClass().getField("y");//getField()只可以看到可见的 getDeclareField()可以看见变量但是变量拿不出来 //setAccessible(true); 这就叫做暴力反射 fiy,get(pt1); 字段的反射替换 package heimaLog; import java.lang.reflect.Field; import java.lang.reflect.Method; public class ReflectPoint { private int x; public int y; public String str1 ="ball"; public String str2 ="basketball"; public String str4 ="icted"; public ReflectPoint(int x, int y) { super(); this.x = x; this.y = y; } public String toString(){ return str1+"----"+str2+"-----"+str4; } public static void main(String[] args) throws IllegalArgumentException, IllegalAccessException { // TODO Auto-generated method stub ReflectPoint p1 = new ReflectPoint(3, 4); changeStringValue(p1); sop(p1); } private static void changeStringValue(Object obj) throws IllegalArgumentException, IllegalAccessException{ Field[] fields = obj.getClass().getFields(); for(Field field:fields){ if(field.getType() ==String.class) { String oldvalue = (String)field.get(obj); String newValue =oldvalue.replace('b','a'); field.set(obj,newValue); } } } public static void sop(Object obj){ System.out.println(obj); } } Method类 代表类中的一个方法 //调用str1.charAt(1); Method menthodCharAt = String.class.getMethods("charAt",int.class); jdk1.4与jdk1.5调用invoke()时的区别 jdk1.4中没有可变参数的概念是使用数组的去接收多个参数。 jdk 1.5 menthodCharAt.invoke(str1,1); jdk 1.4 methodCharAt.invoke(str1,new Object[]{1}); //用反射的方式去调用某个类中的调用mian()方法 class TestArguments{ public staic void main(String[] args){ for(String arg:args){ System.out.println(arg); } } } ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ String startintClassName = args[0]; //因为在这里不知道我们到底要调用哪个类所以这时就用到了反射 Method mainMethod = Class.forName(startingClassName).getMethod("main",String[].class); mainMethod.invoke(null,(Object)new String]{"111","2222","33333"}); 数组的反射: 具有相同维数和元素类型的数组属于同一个类型,即具有相同的Class实例对象 代表数组的Class实例对象的getSupperClass()方法返回的父类为Object类对应的Class. 基本类型的一维数组可以被当做Object类型使用,不能当做Object[] 类型使用,非基本类型的一维数组,既可以当做 Object 类型使用,又可以当做Object[];类型使用 Arrays.asList()方法处理int[]和String[]时的差异: String数组里存的元素都是String类型的对象 int 数组里存的元素都是int的基本类型数据 asList在Jdk1.4中的参数是 asList(Object[] obj) String[]中的数据是对象,Object[]里的元素也是对象, 符合。 int[]中的数据是基本数据类型,不符合Object中元素是对象的规律 所以不符合jdk1.4中的语法。 所以int[]的数据就被当成了一对象去找jdk1.5中的asList()方法 printObject(obj); private static void printObject(Object obj){ Class clazz = obj.getClass(); if(clazz.isArray()){ int len = Array.getLength(obj); for(int i=0;i<len;i++){ System.out.println(Array.get(obj,i)); } }else{ System.out.println(obj); } } ------------------------------------------------------------------------------------------------------------------------------------------- ArrayList_Hashset的比较及HashCode的分析 在HashCode值被确定后在更改参与HashCode运算的值会导致内存泄露(不需要的内容占用内存空间去无法释放) ------------------------------------------------------------------------------------------------------------------------------------------- 反射的作用 -----> 实现框架功能 用配置文件加反射的方式创建ArrayList和HashSet的实例对象 config.properties className = java.util.ArrayList ReflectText2.java InputStream is =new FileInputStream("config.properties");//用完整的路径不是硬编码,而是运算出来的、 /javaweb中的方法 getRealPath(); 获取整个工程的路径 Properties props =new Properties(); props.load(is); is.close(); String className = props.getProperty("className"); Collection collecitons = (Collection)Class.forName(ClassName).newInstance(); 得到资源配置文件的方式:1.javaweb中的方法 getRealPath(); 获取整个工程的路径 2. .class类加载器 ReflectTest2.class.getClassLoader().getResourceAsStream("类的class文件目录/config.Properties"); ReflectTest2.class.getResourceAsStream("config.Properties"); 96.------------------ <a href="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a>、<a href="http://www.itheima.com"target="blank">.Net培训</a>、期待与您交流! ----------------------
相关文章推荐
- 黑马程序员--Java学习日记之类的加载,反射,动态代理,枚举
- 黑马程序员 日记五:反射机制学习总结
- 黑马程序员java学习日记十 反射
- 黑马程序员——学习日记之--反射的用法和Eclipse使用
- 黑马程序员_java学习日记_Java高新技术_反射
- 黑马程序员 反射学习日记
- 黑马程序员-学习日记(反射)
- 学习日记 11 高新(3)反射和静态导入
- 黑马程序员—JAVA基础学习日记十——反射学习总结
- 黑马程序员学习日记--反射
- 黑马程序员_java学习日记_Java高新技术_反射(二)
- 黑马程序员_学习日记43_609基础加强(多播委托、事件、程序集、反射)
- 黑马程序员--Java学习日记5_反射
- 黑马程序员_学习日记十五_基础加强之反射
- 黑马程序员-高新JavaBean内省学习日记
- 黑马程序员-高新注解学习日记
- 黑马程序员--反射机制和类加载器--java学习日记12(高新技术)
- 黑马程序员——学习日记之反射
- 黑马程序员-Java学习(高新)16-枚举,反射
- 黑马程序员_java学习日记_Java高新技术_反射(一)