【初闻反射】-创新互联

初闻反射
  • Java反射机制
    • 通过反射使用一个类
    • 使用反射获取构造方法并使用
    • 通过反射获取成员变量并使用
    • 通过反射获取成员方法并使用
    • 反射作用小练习1

成都创新互联长期为1000+客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为广阳企业提供专业的网站建设、成都网站制作,广阳网站改版等技术服务。拥有10年丰富建站经验和众多成功案例,为您定制开发。
求关注 求支持

1

Java反射机制

Java反射机制:是指在运行时去获取一个类的变量和方法信息。然后通过获取到的信息来创建对象、调用方法的一种机制。由于这种动态性,可以极大的增强程序的灵活性,程序不用在编译期就完成确定,在运行期仍然可以扩展

通过反射使用一个类

事先建立好的Student类
我们要想通过反射去使用一个类,首先我们要获取到该类的字节码文件对象,也就是类型为Cass类型的对象
这里我们提供三种方式获取Class类型的对象
使用类的class属性来获取该类对应的Class对象。举例:Student.class将会返回Student类对应的Class对象

//使用类的Class属性
        Classc1 = Student.class;
        System.out.println(c1);、//输出Student地址

        Classc2 = Student.class;
        System.out.println(c1==c2);

调用对象的getClass()方法,返回该对象所属类对应的Class对象该方法是Object类中的方法,所有的Java对象都可以调用该方法

//调用对象的getClass方法
        Student s=new Student();
        Classc3 = s.getClass();
        System.out.println(c3==c1);

使用Class类中的静态方法forName(String className),该方法需要传入字符串参数,该字符串参数的值是某个类的全路径,也就是完整包名的路径

//使用Class类中的静态方法ForName
        Classc4 = Class.forName("FanSe.GetClassDemo.Demo_01.Student");
        System.out.println(c4==c1);
使用反射获取构造方法并使用
//首先获取class对象
        Classc = Class.forName("FanSe.GetClassDemo.Demo_01.Student");

        //获取公共的构造函数数组
        Constructor[] cons = c.getConstructors();
        for(Constructor con:cons){System.out.println(con);
        }
        System.out.println("_______________________________");
        //获取全部构造方法数组
        Constructor[] constructors = c.getDeclaredConstructors();
        for(Constructor con:constructors){System.out.println(con);
        }

        System.out.println("_______________________________");
        //获取单个公共构造函数
        Constructorcon = c.getConstructor();
            //映射输出构造函数
        Object obj = con.newInstance();
        System.out.println(obj);
            //正常输出构造函数
        Student s=new Student();
        System.out.println(s);

成员变量也可以获取Class在赋值时要一一对应

Classc = Class.forName("FanSe.GetClassDemo.Demo_01.Student");

        Constructorconstructor = c.getConstructor(String.class, int.class, String.class);
        Object obj = constructor.newInstance("XX", 20, "火星");
        System.out.println(obj);

对于私有的构造函数,我们可以用getDeclaredConstructor获取,但映射时会抛出异常,无法对私有的进行赋值,我们可以使用暴力反射 setAccessible(true)

Classc = Class.forName("FanSe.GetClassDemo.Demo_01.Student");

        //Constructorconstructor = c.getConstructor(String.class);
        //Object obj = constructor.newInstance("XX");
        //System.out.println(obj);
        //私有方法,不可以用上面的方式
        ConstructordeclaredConstructor = c.getDeclaredConstructor(String.class);

        //暴力反射,值为true取消权限检查
        declaredConstructor.setAccessible(true);

        Object obj = declaredConstructor.newInstance("XX");
        System.out.println(obj);
通过反射获取成员变量并使用
Classc = Class.forName("FanSe.GetClassDemo.Demo_01.Student");

        //获取公共的成员变量数组
        //Field[] fields = c.getFields();

        //获取全部的成员变量的数组
        Field[] fields = c.getDeclaredFields();
        for(Field field:fields){System.out.println(field);
        }

        //获取公共的单个成员变量
        Field addressField = c.getField("address");//要获取公共变量的名称

            //正常使用
            Student s=new Student();
            s.address="中国";
            System.out.println(s);

            //映射使用
            //获取无参构造函数
            Constructorcon = c.getConstructor();
            Object obj = con.newInstance();

            //使用set方法,将obj对象的address赋值为中国
            addressField.set(obj,"中国");
            System.out.println(obj);

与获取构造方法相似,有四种获取方式但在赋值上,有一个set方法

Field address = c.getField("address");
        Field name = c.getDeclaredField("name");
        Field age = c.getDeclaredField("age");
//通过无参构造函数获取obj对象,将成员变量赋值给obj中对应的数据
        Constructorcon=c.getConstructor();
        Object obj = con.newInstance();
//对于非公有方法,先用暴力反射对其权限修改
        name.setAccessible(true);
        age.setAccessible(true);
        address.set(obj,"中国");
        name.set(obj,"XX");
        age.set(obj,12);
通过反射获取成员方法并使用
Classc = Class.forName("FanSe.GetClassDemo.Demo_01.Student");

        //获取公共的方法,包含继承的方法
        //Method[] methods = c.getMethods();

        //获取全部的方法
        Method[] methods = c.getDeclaredMethods();
        for (Method method : methods) {System.out.println(method);
        }

        //获取单个方法
        Method method1 = c.getMethod("method1");//两个参数,方法名,方法需要的参数(这个是无参方法)

            //获取无参构造获取对象
        Constructorcon = c.getConstructor();
        Object obj = con.newInstance();

            method1.invoke(obj);//两个参数(该方法无参方法)

        System.out.println(obj);
Classc = Class.forName("FanSe.GetClassDemo.Demo_01.Student");

        //获取无参构造
        //Student s=new Student();与普通用法中,构建Student对象类似
        Constructorcon = c.getConstructor();
        Object obj = con.newInstance();

        //获取方法
        Method method1 = c.getMethod("method1");
        Method method2 = c.getMethod("method2", String.class);
        Method method3 = c.getMethod("method3", String.class, int.class);

        method1.invoke(obj);

        method2.invoke(obj,"薛俊");

        Object o = method3.invoke(obj, "薛俊", 23);
        System.out.println(o);


        //获取私有方法
        Method method = c.getDeclaredMethod("function");
        //暴力反射
        method.setAccessible(true);
        method.invoke(obj);
反射作用小练习1

在Integer类型的数组中添加“java牛皮”

ArrayListarrayList=new ArrayList();

        arrayList.add(1);
        arrayList.add(2);
        //arrayList.add("Java牛皮");❌

        System.out.println(arrayList);

这里普通添加无法实现,但利用反射可以实现,还可以调用私有方法

ArrayListarrayList=new ArrayList();

        arrayList.add(1);
        arrayList.add(2);
        //arrayList.add("Java牛皮");❌
		//利用反射添加字符串
            //获取Class,这里已有对象,不需要建立无参构造
       		 Classc = arrayList.getClass();

       		 Method add = c.getMethod("add", Object.class);
        	 add.invoke(arrayList,"Java牛皮");

       		 System.out.println(arrayList);

跪谢查阅

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


网站栏目:【初闻反射】-创新互联
本文网址:http://cdiso.cn/article/ceceos.html

其他资讯