JAVA中的反射机制

Reflect
常规实例化对象:
类——->对象
eg.
Object c=new Object();

反射:
对象——–>类

反射则是从一个对象获取到类的内容。
可以说反射机制可以暴力破解面向对象的封装性!!!
(也就是说我可以通过这个对象得到其他类里的private属性、private方法)

在反射机制里所说的这个对象并非普通的对象,而是一个特殊类的对象,而这个类就是——–Class类
通俗来说,
一堆狗在一块儿,提取出它们的共同特征可以形成一个 Dog类
一堆人在一块儿,提取出他们的共同特征可以形成一个 Person类。
那么,一堆类在一块儿,提取出它们的共同特征就形成了——-Class类。
可能有人会问,类有什么共同特征?
当然有,它们都有属性,构造方法,类里面的方法呀。
除了Class类的对象外,我们还要用到一些东西:
java.lang.reflect.*

import java.lang.reflect.Constructor;
//获取构造方法
import java.lang.reflect.Field;
//获取属性
import java.lang.reflect.InvocationTargetException;
//一些异常抛出
import java.lang.reflect.Method;
//获取方法
import java.lang.reflect.Modifier;
//获取修饰符(toString方法将返回的数字转为对应修饰符)

回归正题,Class类的对象怎样能够得到其他类里面的东西呢?咱们一步一步来说。

首先要创建Class类的对象

/**
     * 创建ClassL类对象
     * 有三种方法
     */
    public static void test1()
    {
        //类.class
        Class personClass=Person.class;

        //Class.forName方法
        try {
            Class personClass1=Class.forName("ReflectTest.Person");
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        //通过对象的getClass方法
        Person person=new Person();
        Class personClass2=person.getClass();

    }

同时我们也可以通过Class类对象,对类进行实例化

/**
     * 通过Class对象实例化目标类的对象
     */
    public static void test2()
    {
        Class personClass=Person.class;
        try {
            Person person=(Person)personClass.newInstance();
        } catch (InstantiationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

根据Class类对象获取到类的构造方法

/**
     * 获取类的构造方法
     */
    public static void test3()
    {
        Class personClass=Person.class;
        //获取所有的构造方法
        Constructor[] constructors=personClass.getConstructors();
        for(int i=0;i<constructors.length;i++)
        {
            System.out.println(constructors[i].getName());
            System.out.println(constructors[i].getParameterTypes());
        }
        System.out.println("-------------------------------");
        try {
            Constructor<Person> constructor=personClass.getConstructor(String.class,int.class,String.class);
            constructor.newInstance("李明",21,"男");
        } catch (NoSuchMethodException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SecurityException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InstantiationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

获取类的所有属性

/**
     * 获得类的所有属性
     */
    public static void test4()
    {
        Class personClass=Person.class;
        //获取所有非私有属性
        Field[] fields=personClass.getFields();
        System.out.println(fields.length);
        //获取所有属性
        Field[] declaredFields=personClass.getDeclaredFields();
        System.out.println(declaredFields.length);
        for(int i=0;i<declaredFields.length;i++)
        {
            int modifiers=declaredFields[i].getModifiers();
            System.out.println(Modifier.toString(modifiers)+" "
            +declaredFields[i].getName()+" "
            +declaredFields[i].getType());
        }
    }

获取类的包名

/**
     * 获取类的包名
     */
    public static void test5()
    {
        Class personClass=Person.class;
        Package package1=personClass.getPackage();
        System.out.println("包名为: "+package1);
    }

获取类的所有方法,并且可以通过该类的实例化对象调用这些方法

/**
     * 获取类的方法
     * 通过实例对象来调用类中的方法
     */
    public static void test6()
    {
        Class personClass=Person.class;
        //获取所有公有的方法(包括继承的父类的方法)
        Method[] methods=personClass.getMethods();
        for(int i=0;i<methods.length;i++)
        {
            System.out.println(methods[i]);
        }
        //调用公有的方法
        System.out.println("调用公有的方法");
        Person person=new Person("狗子", 21, "未知");
        for(int i=0;i<methods.length;i++)
        {
            if(methods[i].getName().equals("toString"))
            {
                try {
                    String a=(String) methods[i].invoke(person);
                    System.out.println(a);
                } catch (IllegalAccessException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IllegalArgumentException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (InvocationTargetException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
        //获取所有方法(包括私有方法,但是只包括当前类,没有父类的方法)
        System.out.println("获取所有的方法:");
        Method[] methods1=personClass.getDeclaredMethods();
        for(int i=0;i<methods1.length;i++)
        {
            System.out.println(methods1[i]);
        }
        System.out.println("调用私有方法");
        for(int i=0;i<methods1.length;i++)
        {
            if(methods1[i].getName().equals("PrivateMethod"))
            {
                //暴力设置私有方法可用
                methods1[i].setAccessible(true);
                try {
                    methods1[i].invoke(person);
                } catch (IllegalAccessException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IllegalArgumentException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (InvocationTargetException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

喜鹊先生Richard

随缘~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值