java反射学习

来源:互联网 发布:php生成二维码 编辑:程序博客网 时间:2024/06/16 06:25
package cn.rrl.baseTest;import java.lang.reflect.Modifier;import java.lang.reflect.Constructor;import java.lang.reflect.Field;  public class Employee {    /**     * getFields()获得某个类的所有的公共(public)的字段,包括父类。        getDeclaredFields()获得某个类的所有申明的字段,即包括public、private和proteced,     * @param args     */    public static void fieldTest(){        try {             //第一种方式:              Class c1 = Class.forName("cn.rrl.baseTest.Person");              //第二种方式:              //java中每个类型都有class 属性.              Class c2 = Person.class;              //第三种方式:              //java语言中任何一个java对象都有getClass 方法              Employee e= new Employee();              Class c3 = e.getClass(); //c3是运行时类 (e的运行时类是Employee)                        Class c= Class.forName("cn.rrl.baseTest.Person");             //创建此Class 对象所表示的类的一个新实例              Object o = c.newInstance(); //调用了Employee的无参数构造方法.                //获取所有的属性?              Field[] fs = c.getDeclaredFields();              //定义可变长的字符串,用来存储属性              StringBuffer sb = new StringBuffer();              //通过追加的方法,将每个属性拼接到此字符串中              //最外边的public定义              sb.append(Modifier.toString(c.getModifiers()) + " class " + c.getSimpleName() +"{\n");  //空格              //里边的每一个属性              for(Field field:fs){                  sb.append("\t");//换行                sb.append(Modifier.toString(field.getModifiers())+" ");//获得属性的修饰符,例如public,static等等                  sb.append(field.getType().getSimpleName() + " ");//属性的类型的名字                  sb.append(field.getName()+";\n");//属性的名字+回车              }              sb.append("}");              System.out.println(sb);             //获取整个类              Class c4 = Class.forName("java.lang.Integer");          } catch (Exception e1) {            e1.printStackTrace();        }     }    /**     * 获取特定的属性     */    public static void getSpecialField(){        try {            Class cp = Class.forName("cn.rrl.baseTest.Person");            Field f = cp.getDeclaredField("age");//获取age属性            Person<Student> p  = (Person<Student>) cp.newInstance();            System.out.println(p.chifan());            //打破封装              f.setAccessible(true); //使用反射机制可以打破封装性,导致了java对象的属性不安全。              //给o对象的id属性赋值"110"              f.set(p, 24); //set              System.out.println(f.get(p));        } catch (Exception e) {            e.printStackTrace();        }    }    public static void main(String[] args) {           //fieldTest();        getSpecialField();    }}
package cn.rrl.baseTest;import java.lang.reflect.ParameterizedType;import java.lang.reflect.Type;public class Student extends Person<Student> {    /**     * @param args     */    public static void main(String[] args) {        Student st =new Student();        Class clazz =st.getClass();         //getSuperclass 获得该类的父类        System.out.println(clazz.getSuperclass());        //getGenericSuperclass()获得带有泛型的父类        Type type = clazz.getGenericSuperclass();        System.out.println(type);        //ParameterizedType参数化类型,即泛型        ParameterizedType pa = (ParameterizedType) type;        Class c = (Class) pa.getActualTypeArguments()[0];        System.err.println(c);    }}/***获取类的属性*/class hello{    public static void main(String[] args) {        Class<?> demo=null;        try{            demo=Class.forName("Reflect.Person");        }catch (Exception e) {            e.printStackTrace();        }        Method method[]=demo.getMethods();        for(int i=0;i<method.length;++i){            Class<?> returnType=method[i].getReturnType();            Class<?> para[]=method[i].getParameterTypes();            int temp=method[i].getModifiers();            System.out.print(Modifier.toString(temp)+" ");            System.out.print(returnType.getName()+"  ");            System.out.print(method[i].getName()+" ");            System.out.print("(");            for(int j=0;j<para.length;++j){                System.out.print(para[j].getName()+" "+"arg"+j);                if(j<para.length-1){                    System.out.print(",");                }            }            Class<?> exce[]=method[i].getExceptionTypes();            if(exce.length>0){                System.out.print(") throws ");                for(int k=0;k<exce.length;++k){                    System.out.print(exce[k].getName()+" ");                    if(k<exce.length-1){                        System.out.print(",");                    }                }            }else{                System.out.print(")");            }            System.out.println();        }    }
0 0
原创粉丝点击