【javase复习】## 反射 ##
2016-08-10 11:55
363 查看
反射: 当字节码文件加载到内存时, 会进行解剖创建一个对应的class对象,把字节码文件的信息都存储进去。
通过class对象使用字节码对象设置对象属性,调用对象方法的过程叫做反射!!
通过class文件可以获取各种构造方法。。方法。。属性,每种对象都有一个类对应。。 直接打印出来就是方法声明。。。
构造方法—–Constructor
方法———-Method
成员变量—–Field
通过class对象使用字节码对象设置对象属性,调用对象方法的过程叫做反射!!
//Person p = new Person(110,"狗娃"); //推荐使用: 获取Class对象的方式一 Class clazz1 = Class.forName("cn.itcast.reflect.Person"); System.out.println("clazz1:"+ clazz1); //获取Class对象的方式二: 通过类名获取 Class clazz2 = Person.class; System.out.println("clazz1==clazz2?"+ (clazz1==clazz2)); //获取Class对象的方式三 :通过对象获取 Class clazz3 = new Person(110,"狗娃").getClass(); System.out.println("clazz2==clazz3?"+ (clazz2==clazz3));
通过class文件可以获取各种构造方法。。方法。。属性,每种对象都有一个类对应。。 直接打印出来就是方法声明。。。
构造方法—–Constructor
方法———-Method
成员变量—–Field
public static void main(String[] args) throws Exception { //获取到对应的Class对象 Class clazz = Class.forName("cn.itcast.reflect.Person"); //通过Class对象获取对应的构造方法 /*Constructor[] constructors = clazz.getConstructors(); // getConstructors()获取一个类的所有公共的构造方法 for(Constructor constructor : constructors){ System.out.println(constructor); } Constructor[] constructors = clazz.getDeclaredConstructors(); //获取到一个类的所有构造方法,包括私有的在内 。 for(Constructor constructor : constructors){ System.out.println(constructor); } */ /*Constructor constructor = clazz.getConstructor(int.class,String.class); // getConstructor 获取单个指定的构造方法。 Person p = (Person) constructor.newInstance(999,"小城"); // newInstance()创建一个对象 System.out.println(p);*/ //获取私有的构造函数 Constructor constructor = clazz.getDeclaredConstructor(null); //暴力反射 constructor.setAccessible(true); Person p =(Person) constructor.newInstance(null); System.out.println(p); /*Method[] methods = clazz.getMethods(); // getMethods() 获取所有 的公共方法而已。 Method[] methods = clazz.getDeclaredMethods(); //获取到所有的方法,但是不包含父类的方法。 for(Method method : methods){ System.out.println(method); }*/ Person p = new Person(110,"狗娃"); /* Method m = clazz.getMethod("eat", int.class); m.invoke(p, 3); //invoke 执行一个方法。 第一个参数:方法的调用对象。 第二参数: 方法所需要的参数。 //执行私有的方法 Method m =clazz.getDeclaredMethod("sleep",int.class); //设置访问权限允许访问 m.setAccessible(true); m.invoke(null, 6); //如果静态方法, 就不用对象了 写null Method m = clazz.getMethod("sum", int[].class); m.invoke(p,new int[]{12,5,9}); } } /*Field[] fields = clazz.getDeclaredFields(); for(Field field : fields){ System.out.println(field); }*/ Person p = new Person(); Field field = clazz.getDeclaredField("id"); //设置访问权限可以访问 field.setAccessible(true); field.set(p, 110); //第一个参数: 设置该数据 的成员变量, 第二个参数:属性值。 System.out.println(p);
相关文章推荐
- 【javase复习】## day 9正则表达式 ##
- JavaSE复习之十一 高级特性:反射和注释
- 【javase复习】## day4 抽象类、接口 ##
- 【javase复习】## day11 其他流 ##
- JavaSE复习之十一 高级特性:反射和注释 补充(1)
- 【javase复习】## day1 故事、构成、环境变量的深入认识 ##
- 【javase复习】## day11 其他流----打印流 ##
- JavaSE复习之十一 高级特性:反射和注释
- 【javase复习】## day9 Map接口 ##
- 【javase复习】## day1 标识符、常量、变量、运算符 ##
- 【javase复习】## day5 多态内存分析、 内部类 ##
- 【javase复习】## day8 集合 Set接口 ##
- 【javase复习】## 网络编程 ##
- 【javase复习】## day8 泛型 ##
- 【javase复习】## day5 异常 ##
- 【javase复习】##day2 对象的内存分析、匿名对象 ##
- 《黑马程序员》java反射复习
- Java基础复习笔记系列 十三 反射机制
- .net重点知识复习(内存管理、垃圾回收、反射)
- [置顶] JavaSE复习总结(二)