JAVA基础整理(8)反射

package com.example.web1_2.annotation;

public class Ann {

    private String name;
    private Integer i;
    private String name2 = "";
    public String name3 = "tt";

    public Ann(){
        this.name = "nn";
    }

    public Ann(String name){
        this.name = name;
    }

    public void ann(){
        this.name = name;
    }

    public void ann(String name){
        this.name = name;
    }

    private Ann(String name, Integer i){
        this.name = name;
        this.i = i;
    }

    public String getName(){
        return this.name;
    }

}

public String ann2() {
        Ann test = new Ann();
        // 获取Class对象
        // 三种方式中,常用第三种,
        // 第一种对象都有了还要反射干什么,
        // 第二种需要导入类包,依赖太强,不导包就抛编译错误。
        // 一般都使用第三种,一个字符串可以传入也可以写在配置文件中等多种方法。
        Class cla = test.getClass();
        //判断是否为某个类的示例
        boolean n = cla.isInstance(test);

        Class cla2 = Ann.class;

        Class cla3;

        try{
            cla3 = Class.forName("com.example.web1_2.annotation.Ann");

            //所有公有构造方法
            Constructor[] conArray = cla3.getConstructors();
            //cla3.getConstructor().newInstance();  Ann test = new Ann();

            for(Constructor c : conArray){
                //c.newInstance();
                //System.out.println(c);
                //public com.example.web1_2.annotation.Ann()
            }

            //所有的构造方法(包括:私有、受保护、默认、公有)
            conArray = cla3.getDeclaredConstructors();
            for(Constructor c : conArray){
                //c.newInstance();
                //System.out.println(c);
                //public com.example.web1_2.annotation.Ann()
            }

            //获取公有、无参的构造方法
            //因为是无参的构造方法所以类型是一个null,不写也可以:这里需要的是一个参数的类型,切记是类型
            Constructor con = cla3.getConstructor(null);
            //class com.example.web1_2.annotation.Ann

            //调用构造方法
            Object obj = con.newInstance();

            //获取私有构造方法,并调用
            Constructor con2 = cla3.getDeclaredConstructor(String.class, Integer.class);
            con2.setAccessible(true);//授权访问
            Object objn = con2.newInstance("cc", (Integer)10);

            //获取所有公有的字段
            Field[] fieldArray = cla3.getFields();
            //获取所有的字段(包括私有、受保护、默认的)
            //fieldArray = cla3.getDeclaredFields();
            for(Field f : fieldArray){
                //System.out.println(f);
            }

            //获取公有字段 并调用
            Field f = cla3.getField("name3");
            //System.out.println(f);
            //public java.lang.String com.example.web1_2.annotation.Ann.name3
            Object obj2 = cla3.getConstructor().newInstance();

            //为字段设置值
            f.set(obj2, "oo");

            f.getType(); //变量类型  class java.lang.String
            f.get(obj2); //获取变量值
            f.getName(); //变量名 name3

            Ann stu = (Ann)obj2;

            //获取私有字段
            f = cla3.getDeclaredField("name");
            //System.out.println(f);
            f.setAccessible(true);//暴力反射,解除私有限定
            f.set(obj2, "pp");
            stu.getName();

            //获取所有的公有方法
            Method[] methodArray = cla3.getMethods();
            //获取所有的方法,包括私有的
            //Method[] methodArray = cla3.getDeclaredMethods()
            for(Method m : methodArray){
                //System.out.println(m);
            }

            //获取公有方法
            Method m = cla3.getMethod("ann", String.class);
            //私有
            //m = cla3.getDeclaredMethod("ann", String.class, Integer.class);
            //System.out.println(m);

            m.getName(); //方法名 ann

            Object obj3 = cla3.getConstructor().newInstance();
            m.invoke(obj3, "mm");
            Ann stu3 = (Ann)obj3;
            stu3.getName();

        } catch (ClassNotFoundException e){
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        }

        return "ok";
    }

你可能感兴趣的:(java,python,开发语言)