反射之一(静态反射基本概念和应用)

  这是我前几天看java基础视频里面看到的,然后我感觉以后或许有用,就先转载进来。反射分为静态反射和动态代理。我这里写的是静态反射的基本概念和一些基本方法。我直接贴代码,有用的东西都在代码里面。

public class Person {

    private static final String TAG = "Person===";
    private String name;
    public int age;

    public Person() {

    }

    public Person(String name, int age) {
    }

    public void run(String run) {
        System.out.println(run);
    }

    private void test(String test) {
        System.out.println(test);
    }

    @Deprecated
    public void test2(String name, Integer age) {
        System.out.println(name + "今年" + age + "岁");
    }
}


  

public class Main {
    //成员方法
    public static void main(String[] args) {
//        Class<Person> personClass = Person.class;
//        Class<?> aClass = Class.forName("....person");
        Person person = new Person();
        Class<? extends Person> clazz = person.getClass();

        //返回所有的公有的方法
        Method[] methods = clazz.getMethods();//获取所有的公有方法,包括父类的方法

        Method[] methods1 = clazz.getDeclaredMethods();//获取所有的方法,包括私有,但是不包括父类的方法

        for (Method method : methods1) {
            String name = method.getName();//获取方法名

            int modifiers = method.getModifiers();//获取方法修饰符
            String modfier = Modifier.toString(modifiers);

            Class<?> returnType = method.getReturnType();//获取返回值类型
            String simpleName = returnType.getSimpleName();

            Class<?>[] parameterTypes = method.getParameterTypes();//获取入参类型
            StringBuilder stringBuilder = new StringBuilder();//StringBuilder线程不安全,不可以在多线程中使用,但是效率高;StrngBuffer线程安全
            stringBuilder.append("(");
            for (Class params : parameterTypes) {
                stringBuilder.append(params.getSimpleName() + ",");
            }
            stringBuilder.append(")");
            System.out.println(modfier + " " + simpleName + " " + name + stringBuilder);
        }


        System.out.println("=====================================");

        try {
            //获取公有的方法,参数一是方法名,参数二是可变参数,参数类型
            Method run = clazz.getMethod("run", String.class);
            Method test2 = clazz.getMethod("test2", String.class, Integer.class);

            System.out.println(run.getName() + "---" + test2.getName());

            //获取所有指定的的方法,包括私有,不包括父类方法
            Method test = clazz.getDeclaredMethod("test", String.class);
            System.out.println(test.getName());

            //运行方法,参数一是对象,可以为空,如果调用的方法是静态的可以传null
            run.invoke(new Person(), "run");
            test2.invoke(new Person(), "liyi", 24);


            test.setAccessible(true);//修改权限
            test.invoke(new Person(), "test");//私有方法不可以直接访问,需要需改权限修饰符
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}


public class Main2 {
    //成员变量
    public static void main(String[] args) {
        try {
            Class<?> clazz = Class.forName("shen.da.ye.reflect.Person");

            //获取公有成员变量,不包括父类的
            Field[] fields = clazz.getFields();

            Field[] fields1 = clazz.getDeclaredFields();//包括私有的

            for (Field field : fields1) {
                String name = field.getName();//变量名
                int modifiers = field.getModifiers();
                String modifier = Modifier.toString(modifiers);

                Class<?> type = field.getType();
                System.out.println(modifier + " " + type.getSimpleName() + " " + name);
            }

            //获取公有指定的成员
            Field age = clazz.getField("age");
            Field TAG = clazz.getDeclaredField("TAG");
            System.out.println(age.getName() + "===" + TAG.getName());

            //修改指定成员的值,如果没有权限还是setAccessable
            Person person = new Person();
            age.set(person, 23);
            System.out.println(person.age);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

public class Main3 {
    //构造
    public static void main(String[] args) {
        Class<Person> clazz = Person.class;
        Constructor<?>[] constructors = clazz.getConstructors();//获取所有公有的构造函数
        Constructor<?>[] constructors1 = clazz.getDeclaredConstructors();//获取所有的构造函数
        for (Constructor constructor : constructors) {
            String name = constructor.getName();

            int modifiers = constructor.getModifiers();
            String modifier = Modifier.toString(modifiers);

            Class[] parameterTypes = constructor.getParameterTypes();
            StringBuilder stringBuilder = new StringBuilder();
            stringBuilder.append("(");
            for (Class params : parameterTypes) {
                stringBuilder.append(params.getSimpleName() + ",");
            }
            stringBuilder.append(")");
            System.out.println(modifier + " " + name + stringBuilder);

            try {
                Constructor<Person> constructor1 = clazz.getConstructor(String.class, int.class);//获取指定公有的构造方法

                Constructor<Person> constructor2 = clazz.getDeclaredConstructor(String.class, int.class);//获取所有指定的构造函数
                System.out.println(constructor2.getName());

                Person person2 = (Person) constructor.newInstance();//如果调私有设置access
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}


等我有空把视频看完再把动态代码写成一篇转载blog。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值