反射机制:管理一个类的成员属性,成员方法,构造方法的步骤

反射机制:管理一个类的成员属性,成员方法,构造方法的步骤

  • 三种方式获取Class对象
@Test//获取Class --范围:所有的字节码文件
    public void test1() throws ClassNotFoundException {
        //方式1--通过类名
        Class c=Dog.class;//Dog.java编译后的字节码文件
        Class c1=Book.class;//Book.java编译后的字节码文件
        //方式2--通过对象
        Class c3 = new Dog().getClass();
        //方式3--通过类路径
        Class c4 = Class.forName("reflect1.Book");
    }
  • 管理无参构造
//1.管理无参构造
    @Test
    public void test2() throws Exception {
        //1.获取到某个类的字节码文件对象,即Class的对象
        Class<Dog> c = Dog.class;
        //2.帮Dog调用无参构造
        Dog dog = c.newInstance();
        System.out.println(dog);
    }
  • 管理有参构造
//2.管理有参构造
    @Test
    public void test3() throws Exception {
        //1.获取到某个类的字节码文件对象,即Class的对象
        Class<Dog> c = Dog.class;
        //2.获取有参构造的管理对象--2个参数的那个
        Constructor<Dog> con = c.getDeclaredConstructor(String.class,int.class);
        //3.帮助Dog类调用有参构造
        Dog dog = con.newInstance("旺财",2);
        System.out.println(dog);
    }
  • 管理属性
//3.管理属性
    @Test
    public void test4() throws Exception {
        //1.获取到某个类的字节码文件对象,即Class的对象
        Class<Dog> c = Dog.class;
        //2.获取某个属性的管理对象
        Field f = c.getDeclaredField("name");
        //先创建一个狗狗对象
        Dog dog = c.newInstance();
        f.setAccessible(true);//开启私有属性操作权限
        //3.帮助dog给name属性赋值
        f.set(dog,"来福");
        System.out.println(dog);
    }
  • 管理方法
 //4.管理方法
    @Test
    public void test5() throws Exception {
        //1.获取到某个类的字节码文件对象,即Class的对象
        Class<Dog> c = Dog.class;
        //2.获取某个方法setAge(int age)的管理对象
        Method m = c.getDeclaredMethod("setAge", int.class);
        //先创建一个狗狗对象
        Dog dog = c.newInstance();
        //3.帮助dog给调用setAge方法
        m.invoke(dog,3);
        //System.out.println(dog);
        //管理toString方法
        Method m2 = c.getDeclaredMethod("toString");
        System.out.println(m2.invoke(dog));
    }

常用的方法:

1.获得类的构造方法可以调用类对象的以下方法:

下面展示一些 内联代码片

  //获得所有公共的构造函数(除私有的)
        Constructor[]s= Class.forName("Dog").getConstructors();
        //获得指定参数公共的构造函数(除私有的)
        Constructor<?> s1= Class.forName("Dog").getConstructor(String.class,int.class);
        //获得所有构造函数
        Constructor[]ds= Class.forName("Dog").getDeclaredConstructors();
        //获得指定参数类型的构造函数
        Constructor<?> ds1= Class.forName("Dog").getDeclaredConstructor(String.class,int.class);

        //获得普通方法(除私有)
        Method []method=Class.forName("Dog").getMethods();
        //获取公共指定方法名的普通方法(除私有的)
        Method method1=Class.forName("Dog").getMethod("getAge");
        //获取所有的普通方法
        Method []method2=Class.forName("Dog").getDeclaredMethods();
        //获取指定方法名的普通方法
        Method  method3=Class.forName("Dog").getDeclaredMethod("getAge");

        //获得成员变量
        Field []field=Class.forName("Dog").getFields();
        Field field1=Class.forName("Dog").getField("name");
        Field []field2=Class.forName("Dog").getDeclaredFields();
        Field field3=Class.forName("Dog").getField("name");
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值