Java 反射

来源:互联网 发布:windows update35%卡住 编辑:程序博客网 时间:2024/06/10 21:55

创建 POJO

//Persion.javapublic class Person {    public void show() {    }}//Student.javapublic class Student extends Person{    // 成员变量    public String name = "张三";// 公共    private int age;// 私有    // public  构造方法    public Student() {        System.out.println("无参构造方法");    }    // public  构造方法    public Student(String name) {        System.out.println("姓名:" + name);    }    // private 构造方法    private Student(int age) {        System.out.println("年龄:" + age);    }    // 默认 构造方法    Student(String name, int age) {        System.out.println("姓名:" + name + ",年龄:" + age);    }    // public 普通方法    public void m1() {        System.out.println("m1");    }    // public 普通方法      public void m2(String name) {        System.out.println(name);    }    // public 普通方法    public String m3(String name) {        return name;    }    // public 普通方法    public static void m5(String name, int age) {        System.out.println(name + "," + age);    }    // public 普通方法    public static void m6(String[] args) {        for (int i = 0; i < args.length; i++) {            System.out.println(args[i]);        }    }    // private 普通方法    private void m4(int age) {        System.out.println(age);    }}

获取构造方法

  1. Class相关的常用方法:
    1. static Class forName(String className)
    返回与带有给定字符串名的类或接口相关联的 Class 对象。
  2. 与构造函数相关的方法:
    1. Constructor getConstructor(Class … parameterTypes)
    返回一个 Constructor 对象,返回 指定(参数) 的公共构造方法。
    2. Constructor [] getConstructors()
    返回一个包含某些 Constructor 对象的数组,这些对象反映此 Class 对象所表示的类的 所有 公共构造方法。
    3. Constructor getDeclaredConstructor(Class… parameterTypes) // Declared 声明
    返回一个 Constructor 对象,返回 指定(参数) 的公共构造方法(包括私有构造方法)
    4. Constructor[] getDeclaredConstructors()
    返回 Constructor 对象的一个数组,返回 所有 构造方法(包括私有构造方法)
  3. 初始化对象的相关方法:
    1. T newInstance(Object… initargs)
    使用此 Constructor 对象表示的 构造方法 来创建该构造方法的声明类的新实例,并用指定的 初始化参数 初始化该实例。
    2. T newInstance()
    创建此 Class 对象所表示的类的一个新实例。
public class 获取构造方法 {    @Test    public void test1() throws Exception {        Student stu = (Student) getClazz("cn.itcast.reflect.Student");    }    /**    * 根据给定的 String 获取 Class,并创建该实例    */    private Object getClazz(String className) throws ClassNotFoundException,            InstantiationException, IllegalAccessException {        Class clazz = Class.forName(className);        return clazz.newInstance();    }    @Test    // 得到 **字节码** 对象的3种方式    public void test2() throws Exception {        // 1.         Class clazz = Class.forName("cn.itcast.reflect.Student");        // 2.        Class clazz = Student.class;        // 3.        Student stu = new Student();        Class clazz = stu.getClass();        clazz.newInstance();    }    @Test    // 无参构造,初始化对象    // public Student()    public void test3() throws Exception {        Class clazz = Class.forName("cn.itcast.reflect.Student");        // clazz.newInstance();        Constructor c = clazz.getConstructor();// 得到一无参构造函数        c.newInstance();    }    @Test    // 有参构造,初始化对象    // public Student(String name)    public void test4() throws Exception {        Class clazz = Class.forName("cn.itcast.reflect.Student");        // clazz.newInstance();        Constructor c = clazz.getConstructor(String.class);// 得到一个有参(String类型)构造函数        c.newInstance("tom");    }    @Test    // 私有的构造方法,初始化对象    // public Student(int age)    public void test5() throws Exception {        Class clazz = Class.forName("cn.itcast.reflect.Student");        // clazz.newInstance();        Constructor c = clazz.getDeclaredConstructor(int.class);// 得到一个有参(int类型)私有构造函数        c.setAccessible(true);// 暴力反射,Accessible 无障碍        c.newInstance(20);    }    @Test    // 默认的构造方法,初始化对象    // public Student(String name,int age)    public void test6() throws Exception {        Class clazz = Class.forName("cn.itcast.reflect.Student");        // clazz.newInstance();        Constructor c = clazz.getDeclaredConstructor(String.class, int.class);// 得到一个有参(String类型)构造函数        c.setAccessible(true);// 暴力反射,Accessible 无障碍        c.newInstance("tom", 20);    }    @Test    // 获取全部的 公共构造方法    public void test7() throws Exception {        Class clazz = Class.forName("cn.itcast.reflect.Student");        Constructor[] cs = clazz.getConstructors();        System.out.println(cs.length);    }    @Test    // 获取全部的 构造方法    public void test8() throws Exception {        Class clazz = Class.forName("cn.itcast.reflect.Student");        Constructor[] cs = clazz.getDeclaredConstructors();        System.out.println(cs.length);    }}

获取变量

  1. Field 相关的方法
    1. Field getField(String name)
    返回一个 Field 对象,它反映此 Class 对象 所表示的 类或接口 的指定公共成员字段。
    2. Field[] getFields()
    返回一个包含某些 Field 对象的数组,这些对象反映此 Class 对象所表示的类或接口所有可访问公共字段。
    3. Field getDeclaredField(String name)
    返回一个 Field 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明字段。
    4. Field[] getDeclaredFields()
    返回 Field 对象的一个数组,这些对象反映此 Class 对象所表示的类或接口所声明的所有字段。
  2. 操作Field对象的方法:
    1. Object get(Object obj) 返回指定对象上此 Field 表示的字段的值。
    2. void set(Object obj, Object value) 给第一个参数所表示的对象,第二个参数 赋值

Modifier 类

Modifier 类提供了 static 方法和常量,对类和成员访问修饰符进行解码。
修饰符集被表示为整数,用不同的位 位置 (bit position) 表示不同的修饰符。
表示修饰符的常量值取自于 The JavaTM Virtual Machine Specification, Second edition 的表 4.1、4.4、4.5 和 4.7。

public class 获取变量 {    @Test    // 操作 公共变量name    public void test1() throws Exception {        Student stu = new Student();        Class clazz = Student.class;        Field f = clazz.getField("name");        System.out.println(f.get(stu));        // 赋值        f.set(stu, "李四");        Field f1 = clazz.getField("name");        System.out.println(f1.get(stu));    }    @Test    // 操作 私有变量age    public void test2() throws Exception {        Student stu = new Student();        Class clazz = Student.class;        Field f = clazz.getDeclaredField("age");        f.setAccessible(true);        f.set(stu, 18);        /*        不同的Field 对象,每次都需要 setAccessible(true);        Field f1 = clazz.getDeclaredField("age");        f1.setAccessible(true);        */        System.out.println(f.get(stu));    }    @Test    // 操作 所有变量    public void test3() throws Exception {        Student stu = new Student();        Class clazz = Student.class;        // Field f = clazz.getDeclaredField("name");        Field[] fs = clazz.getDeclaredFields();        for (Field f : fs) {            System.out.println(                Modifier.toString(f.getModifiers()) + "\t"                    + f.getType().getSimpleName() + "\t" + f.getName());        }        /*        无参构造方法        public  String  name        private int age        final   ExampleUnitTest this$0        */    }}

获取方法

  1. 与操作方法相关的方法:
    1. Method getMethod(String name, Class
public class 获取方法 {    @Test    // public void m1()    public void test1() throws Exception {        // Student stu = new Student();        Class clazz = Student.class;        Method m = clazz.getMethod("m1");        m.invoke(clazz.newInstance(), null); // 此方法代表要执行m方法。第一个参数:表示要执行哪个对象中的方法,第二个参数:代表实参。    }    @Test    // public void m2(String name)    public void test2() throws Exception {        Class clazz = Student.class;        Method m = clazz.getMethod("m2", String.class);        m.invoke(clazz.newInstance(), "tom"); // 此方法代表要执行m方法。第一个参数:表示要执行哪个对象中的方法,第二个参数:代表实参。    }    @Test    // public String m3(String name){    public void test3() throws Exception {        Class clazz = Student.class;        Method m = clazz.getMethod("m3", String.class);        Object o = m.invoke(clazz.newInstance(), "tom"); // invoke方法的返回值,就是执行的方法的返回值。如果是void的方法,则返回null。        System.out.println(o);    }    @Test    // private void m4(int age)    public void test4() throws Exception {        Class clazz = Student.class;        Method m = clazz.getDeclaredMethod("m4", int.class);        m.setAccessible(true);        m.invoke(clazz.newInstance(), 18); // invoke方法的返回值,就是执行的方法的返回值。如果是void的方法,则返回null。    }    @Test    // public static void m5(String name,int age)    public void test5() throws Exception {        Class clazz = Student.class;        Method m = clazz.getMethod("m5", String.class, int.class);        m.invoke(null, "tom", 18); // invoke方法的返回值,就是执行的方法的返回值。如果是void的方法,则返回null。    }    @Test    // public static void m6(String[] args){    public void test6() throws Exception {        Class clazz = Student.class;        Method m = clazz.getMethod("m6", String[].class);        // m.invoke(null,new Object[]{new String[]{"tom","jerry","aaa"}});        // //invoke方法的返回值,就是执行的方法的返回值。如果是void的方法,则返回null。        m.invoke(clazz.newInstance(), (Object) new String[] { "tom", "jerry", "aaa" });    }    @Test    // 得到所有方法    public void test7() throws Exception {        Class clazz = Student.class;        Method[] ms = clazz.getMethods();// 得到所有公共的方法        System.out.println(ms.length);    }    @Test    // 得到所有方法    public void test8() throws Exception {        Class clazz = Student.class;        Method[] ms = clazz.getDeclaredMethods();// 得到当前类所有方法        System.out.println(ms.length);    }}

使用反射打印制定类内容

public class 反射打印制定类内容 {    public static void main(String[] args) {        Class c = Student.class;        System.out.println(c);        //从命令行 参数 或 用户输入 中读取的类名        String name;        Scanner input = new Scanner(System.in);        System.out.println("输入类名(例如java.util.Date):");        name = input.next();        try {            //打印 类名 和 父类名(if != Object)            Class c1 = Class.forName(name);            Class superc1 = c1.getSuperclass();            String modifiers = Modifier.toString(c1.getModifiers());//将修饰符打印出来            if(modifiers.length()>0)                System.out.print(modifiers);            System.out.print(" class "+name);            if(superc1 != null && superc1 != Object.class)                System.out.print(" extends "+ superc1.getName());            System.out.print("\n{\n");            printConstructors(c1);            System.out.println();            printMethods(c1);            System.out.println();            printFields(c1);            System.out.println("}");        } catch (ClassNotFoundException e) {            e.printStackTrace();        }    }    /**     * 打印一个类的所有构造函数     * @param c1 a class     */    public static void printConstructors(Class c1){        Constructor[] constructors = c1.getDeclaredConstructors();        for (Constructor c : constructors) {            String name = c.getName();            System.out.print("    ");            String modifiers = Modifier.toString(c.getModifiers());            if(modifiers.length()>0)                System.out.print(modifiers + " ");            System.out.print(name + "(");            //打印参数类型            Class[] paramTypes = c.getParameterTypes();            for (int i = 0; i < paramTypes.length; i++) {                if(i > 0)System.out.print(", ");                System.out.print(paramTypes[i].getName());            }            System.out.println(");");        }    }    /**     * 打印类的所有方法     * @param c1 a class     */    public static void printMethods(Class c1){        Method[] methods = c1.getDeclaredMethods();        for (Method m : methods) {            Class retType = m.getReturnType();            String name = m.getName();            System.out.print("    ");            //打印修饰符,返回类型和方法名            String modifiers = Modifier.toString(m.getModifiers());            if(modifiers.length()>0)                System.out.print(modifiers + " ");            System.out.print(retType.getName() + " " + name + "(");            //打印参数类型            Class[] paramTypes = m.getParameterTypes();            for (int i = 0; i < paramTypes.length; i++) {                if(i > 0)System.out.print(", ");                System.out.print(paramTypes[i].getName());            }            System.out.println(");");        }    }    /**     * 打印类的所有字段     * @param c1 a class     */    public static void printFields(Class c1){        Field[] fields = c1.getDeclaredFields();        for (Field f : fields) {            System.out.print("    ");            Class type = f.getType();            String name = f.getName();            String modifier = Modifier.toString(f.getModifiers());            if(modifier.length()>0)System.out.print(modifier + " ");            System.out.println(type + " " + name +";");        }    }}/*打印内容class com.wjz.ExampleUnitTest$Studentpublic class com.wjz.ExampleUnitTest$Student extends com.wjz.ExampleUnitTest$Person{    com.wjz.ExampleUnitTest$Student(com.wjz.ExampleUnitTest, java.lang.String, int);    private com.wjz.ExampleUnitTest$Student(com.wjz.ExampleUnitTest, int);    public com.wjz.ExampleUnitTest$Student(com.wjz.ExampleUnitTest, java.lang.String);    public com.wjz.ExampleUnitTest$Student(com.wjz.ExampleUnitTest);    public void m1();    private void m4(int);    public java.lang.String m3(java.lang.String);    public void m2(java.lang.String);    public void m6([Ljava.lang.String;);    public void m5(java.lang.String, int);    public class java.lang.String name;    private int age;    final class com.wjz.ExampleUnitTest this$0;}*/