反射的学习

反射就是把java类中的各种成分映射成一个个的Java对象
        例如:一个类有:成员变量、方法、构造方法、包等等信息,利用反射技术可以对一个类进行解剖,把个个组成部分映射成一个个对象。
     (其实:一个类中这些成员方法、构造方法、在加入类中都有一个类来描述)
        如图是类的正常加载过程:反射的原理在与class对象。
熟悉一下加载的时候:Class对象的由来是将class文件读入内存,并为之创建一个Class对象。

获取Class

//        使用类的class属性来获取该类对应class对象
//        调用对象的getClass()方法,返回该对象所属类对应的class对象

//        使用class类中的静态方法forName(String className)
      
 

package com.itheima_01;

public class ReflectDemo {
    public static void main(String[] args) throws ClassNotFoundException {
//        使用类的class属性来获取该类对应class对象
        Class<Student> c1=Student.class;
        System.out.println(c1);

        Class<Student> c2=Student.class;
        System.out.println(c1=c2);
        System.out.println("-------------");
//        调用对象的getClass()方法,返回该对象所属类对应的class对象
        Student s=new Student();
        Class<?extends Student> c3=s.getClass();
        System.out.println(c1==c3);
        System.out.println("-------------");

//        使用class类中的静态方法forName(String className)
        Class<?> c4=Class.forName("com.itheima_01.Student");
        System.out.println(c1==c4);




    }
}

package com.itheima_03;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;

/*
反射获取成员变量并使用

* */
public class ReflectDemo01 {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
//        获取Class对象
        Class<?> c=Class.forName("com.itheima_01.Student");
//        Filed[] getFields()返回一个包含Field对象的数组,Field对象反映由该Class对象表示的类或接口的所有可访问的公共字段
//        Filed[] getDeclaredFields()返回一个包含Field对象的数组,反映了由该Class对象表示的类或接口声明所有字段
//        Field[] fields = c.getFields();
        Field[] fields=c.getDeclaredFields();
        for (Field f:fields)
        {
            System.out.println(f);
        }
        System.out.println("——————————————获取单个成员变量————————---");
//        Field getField(String name)返回一个Field对象,该对象反映由该Class对象表示的类或者接口的指定公共成员字段
        Field addressField=c.getField("address");
        System.out.println(addressField);
//        Filed[] getField()返回单个公共成员变量对象
//        Filed[] getDeclaredField()返回单个成员变量对象
//        获取无参构造方法创建对象
        Constructor<?> con=c.getConstructor();
        Object obj=con.newInstance();
//
        addressField.set(obj,"西安");//给obj的成员变量addressField赋值为西安
        System.out.println(obj);




    }
}

package com.itheima_03;

import com.itheima_01.Student;

import javax.xml.namespace.QName;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
/*
Student s=new Student();
s.name="林青霞";
s.age=30;
s.address="西安";
System.out.println(s);
*/
public class ReflectDemo02 {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException, NoSuchFieldException {
        Class<?> c=Class.forName("com.itheima_01.Student");
//        Student s=new Student();
        Constructor<?> con=c.getConstructor();
        Object obj=con.newInstance();
        System.out.println(obj);
/*//       将所有的成员变量去不获取
        Field[] fields=c.getDeclaredFields();
        for (Field f:fields)
        {

        }*/
//        s.name="林青霞";
//        NoSuchFieldException: name因为是私有的
//        Field nameField=c.getField("name");//拿到的是公共的成员变量
        Field nameField=c.getDeclaredField("name");//IllegalAccessException
//        需要取消访问检查
        nameField.setAccessible(true);//取消对私有成员变量的检查
        nameField.set(obj,"林青霞");
        System.out.println(obj);

        Field ageField=c.getDeclaredField("age");
        ageField.setAccessible(true);
        ageField.set(obj,30);
        System.out.println(obj);

        Field addressField=c.getDeclaredField("address");
        addressField.setAccessible(true);
        addressField.set(obj,"西安");

        System.out.println(obj);






    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值