java反射机制

来源:互联网 发布:分水岭算法的大米图 编辑:程序博客网 时间:2024/06/03 19:29

  最近在学一些框架,然后又把java的反射拿来看了看,通过学习视频和别人的博客对反射有了新的理解。
  在之前如果问我什么是反射我会毫不犹豫地告诉你我知道,我在jdbc连接数据库的时候用过反射。

  现在想想真的挺天真的。就总结了下面的文章,如有不正请指正。

  我就不说java反射的概念了,因为概念看了像天书一样。
  1:java反射作用:
    ①:反编译   .class文件--->.java文件
    ②:通过反射机制访问java对象的属性方法以及构造方法。
  2:什么是Class?
      java的Class类是java反射机制的基础,通过Class类我们可以获得关于一个类的相关信息,下面我们来了解一下有关java中Class类的相关知识!

      java.lang.Class是一个比较特殊的类,它用于封装被装入到JVM中的类(包括类和接口)的信息。

      当一个类或接口被装入的JVM时便会产生一个与之关联的java.lang.Class对象,可以通过这个Class对象对被装入类的详细信息进行访问。
      一般获取类有三种方法:
        //方法一    
 Class c1=Class.forName("java.lang.String");
        //方法二
  Class c2=User.class;//其中User是一个类
        //方法三
  Class c2=User.class;//其中User是一个类
   3:创建对象
      我们上面已经讲了获取类的方法,那么我们要做就是创建他的对象。
       Class c1=Class.forName("User");       Object o=c1.newInstance();//此句会调用User的无参构造方法
    4:获取类中的属性,方法以及变量类型
    ①:获取方法
       Class c1=Class.forName("User");       Object o=c1.newInstance();//此句会调用User的无参构造方法
    ②:获取属性(Field)
        User类
            public class User {            private String id;            public int age;            protected String addr;            boolean sex;        }
        获取属性的类
  public class User {            private String id;            public int age;            protected String addr;            boolean sex;        }    
    //获取所有类型的属性
   Field [] fs=c.getDeclaredFields();    for(Field field:fs)    {        int i= field.getModifiers();        String string =Modifier.toString(i);        System.out.println(string);        //因为我们获取的String等属性都是一个类,所以返回值的类型就是类的类Class        Class type =field.getType();        System.out.println(type.getSimpleName());        System.out.println(field.getName());    }    }


    那么如果我们想输出像User类这样的结果需要怎么做呢?

    代码

Class c =Class.forName("User");        Field [] fs=c.getDeclaredFields();    StringBuffer sb=new StringBuffer();    sb.append(Modifier.toString(c.getModifiers())+"class"+c.getSimpleName()+"{\n");        for(Field field:fs) {        sb.append("\t");        sb.append(Modifier.toString(field.getModifiers())+" ");        sb.append(field.getType().getSimpleName()+" ");        sb.append(field.getName()+";\n");        }    sb.append("}");    System.out.println(sb);

    ③:获取类中的构造方法:
  Class c =Class.forName("java.lang.String");    Constructor[]cs=c.getConstructors();    for(Constructor con:cs) {        //获取修饰符        System.out.println(Modifier.toString(con.getModifiers()));        //获取构造方法名        System.out.println(c.getName());        //构造方法的形式列表        Class[] parameterTypes = con.getParameterTypes();        for(Class cla:parameterTypes) {            System.out.println(cla.getSimpleName());        }    }


5:反编译举例
我们来反编译String
代码如下
    Class c =Class.forName("java.lang.String");    Constructor[]cs=c.getConstructors();    //反编译    StringBuffer sb=new StringBuffer();    sb.append(Modifier.toString(c.getModifiers())+" "+"class"+c.getSimpleName()+"{\n");        for(Constructor con:cs) {                sb.append("\t");        sb.append(Modifier.toString(con.getModifiers())+" ");        sb.append(c.getSimpleName()+"(");        //形参        Class [] para=con.getParameterTypes();        for(int i=0;i<para.length;i++) {            Class para1=para[i];            if(i==para.length-1) {                sb.append(para1.getSimpleName());            }            else {                sb.append(para1.getSimpleName()+",");            }                    }        sb.append("){}\n");    }    sb.append("}");        System.out.println(sb);