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
原创粉丝点击