java反射
来源:互联网 发布:淘宝子账号名字大全 编辑:程序博客网 时间:2024/06/01 08:44
java中final类型的值能不能被修改?
在c,c++中 我们可以通过指针直接修改内存的值,包括final修饰的,在java中不存在指针概念,但是java确留了一黑手:反射!!
反射能做什么?
1:通过反射能获得类名,包名等信息!
class2 = Person.class; System.out.println("Demo2:(写法2) 包名: " + class2.getPackage().getName() + "," + "完整类名: " + class2.getName());
2:通过反射,可以通过Class,或者类名创建对象
public static void Demo3() throws ClassNotFoundException, InstantiationException, IllegalAccessException { Class<?> class1 = null; class1 = Class.forName("cn.lee.demo.Person"); //由于这里不能带参数,所以你要实例化的这个类Person,一定要有无参构造函数哈~ Person person = (Person) class1.newInstance(); person.setAge(20); person.setName("LeeFeng"); System.out.println("Demo3: " + person.getName() + " : " + person.getAge()); }
3:可以调用一个类的方法(包括私有方法)
public static void Demo7() throws ClassNotFoundException, SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException, InstantiationException { Class<?> class1 = null; class1 = Class.forName("cn.lee.demo.SuperMan"); System.out.println("Demo7: \n调用无参方法fly():"); Method method = class1.getMethod("fly"); method.invoke(class1.newInstance()); System.out.println("调用有参方法walk(int m):"); method = class1.getMethod("walk",int.class); method.invoke(class1.newInstance(),100); }
4:可以获取(修改)一个对象的属性
public static void Demo5() throws IllegalArgumentException, IllegalAccessException, SecurityException, NoSuchFieldException, InstantiationException, ClassNotFoundException{ Person p=new Person(); //获得对象的 name属性 Field personNameField = p.getClass.getDeclaredField("name"); personNameField.setAccessible(true); //获得字段类型 Class type=personNameField.getType(); //获得p对象的name字段的值,直接转换为String String valueStr=personNameField.get(p).toString(); //重新复值给name personNameField.set(obj, "胖虎先森");}
5: 通过Java反射机制得到类的一些属性: 继承的接口,父类,函数信息,成员信息,类型等
public static void Demo6() throws ClassNotFoundException { Class<?> class1 = null; class1 = Class.forName("cn.lee.demo.SuperMan"); //取得父类名称 Class<?> superClass = class1.getSuperclass(); Field[] fields = class1.getDeclaredFields(); for (int i = 0; i < fields.length; i++) { System.out.println("类中的成员: " + fields[i]); } //取得类方法 Method[] methods = class1.getDeclaredMethods(); for (int i = 0; i < methods.length; i++) { System.out.println("Demo6,取得SuperMan类的方法:"); System.out.println("函数名:" + methods[i].getName()); System.out.println("函数返回类型:" + methods[i].getReturnType()); System.out.println("函数访问修饰符:" + Modifier.toString(methods[i].getModifiers())); System.out.println("函数代码写法: " + methods[i]); }
总结:反射就是java给程序猿留的一道后门,绝逼是java中最黑的科技!!常用于框架设计,修改系统变量值,典型使用是dex分包热修复框架中通过反射将系统classLoader dex包的给修改了!(细思极恐…)
0 0
- 【反射】JAVA反射机制
- JAVA 反射
- java 反射
- Java反射
- java反射
- java反射
- JAVA反射
- java 反射
- Java 反射
- java 反射
- Java反射
- java反射
- JAVA 反射
- java 反射
- Java反射
- java反射
- java 反射
- java 反射
- hdu 1282 回文数猜想
- 解决在IE下label中点击img图片无法选中radio的方案
- #安卓面试知识点总结
- mysql
- Jfinal事务回滚
- java反射
- 将项目导入到MyEclipse
- android摇一摇功能实现
- java键盘输入的2种用法
- html5/jquery插件应用
- MC9S中断函数编写
- ACM简单计算题-棋盘上的距离
- 最简单的SwipeRefreshLayout下拉刷新
- ZCMU-1400-给报销吗