JAVA的反射机制初涉

1.什么是JAVA的反射机制

         java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性。

2.JAVA的反射机制的作用

         用来编写一些通用性较高的代码或者框架的时候使用


Class

        Class类的实例表示正在运行的Java应用程序中的类的接口

              ——已知类和对象的情况下

                      类名.class

                      对象.getClass()--------------Object类提供

             ——未知类和对象的情况下

                      Class.forName("包名.类名")

Constructor

        关于类的单个构造方法的信息以及对它的访问权限

Field

        提供有关类或接口的单个字段信息,以及对它的动态访问权限

Method

        提供关于类或接口上单独某个方法的信息

 

对应关系



案例代码

1.目录结构

2.Person类

package com.imooc.reflect.test;

public class Person {

    public  String name;
    private  String sex;

    public Person() {
        super();
    }

    public Person(String name, String sex) {
        super();
        this.name = name;
        this.sex = sex;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public void eat(){
        System.out.println("吃-----------");
    }

    private void run(){
        System.out.println("跑-----------");
    }
    private void studt(String name){
        System.out.println(name+"在学习-------------");
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", sex='" + sex + '\'' +
                '}';
    }
}

3.ClassTest

package com.imooc.reflect.test;


import org.junit.Test;

public class ClassTest {
    @Test
    /**
     * 获得Class对象
     *  1.通过类名.class
     *  2.对象.getClass()
     *  3.Class.forName()------推荐
     */
    public void demo1() throws ClassNotFoundException {
        //1.通过类名.class的方式
        Class class1 = Person.class;
        //2.通过对象.getClass()的方式
        Person person = new Person();
        Class class2 = person.getClass();
        //3.Class类forName();获得(推荐)
        Class class3 = Class.forName("com.imooc.reflect.test.Person");
    }
}

4.ConstructorTest

package com.imooc.reflect.test;

import org.junit.Test;

import java.lang.reflect.Constructor;

public class ConstructorTest {

    @Test
    /**
     *  获得无参数的构造方法
     */
    public void demo1() throws Exception {
        //获得类的字节码对应的对象
        Class class1 = Class.forName("com.imooc.reflect.test.Person");
        //得到一个无参的构造方法
        Constructor c = class1.getConstructor();
        Person person = (Person) c.newInstance();//相当于Person person = new Person();
        person.eat();
    }

    @Test
    /**
     * 获得有参数的构造方法
     */
    public void demo2() throws Exception {
        //获得类的字节码对应的对象
        Class class1 = Class.forName("com.imooc.reflect.test.Person");
        //获得有参构造
        Constructor c = class1.getConstructor(String.class,String.class);
        Person person = (Person) c.newInstance("张三", "男");// 相当于Person person = new Person("张三", "男");
        System.out.println(person);
    }
}

5.FieldTest

package com.imooc.reflect.test;

import org.junit.Test;

import java.lang.reflect.Field;

public class FieldTest {
    @Test
    /**
     *  测试公有属性
     */
    public void demo1() throws Exception {
        //获得Class
        Class class1 = Class.forName("com.imooc.reflect.test.Person");
        //获得公有属性
        Field field = class1.getField("name");
        //新建对象
        Person p = (Person)class1.newInstance();
        //操作属性
        field.set(p,"李四");
        String name = (String)field.get(p);
        System.out.println(name);
    }

    @Test
    /**
     * 测试私有属性
     */
    public void demo2() throws Exception {
        //获得Class
        Class class1 = Class.forName("com.imooc.reflect.test.Person");
        //获得私有属性
        Field field = class1.getDeclaredField("sex");
        //新建对象
        Person p = (Person) class1.newInstance();
        //私有属性需要设置可访问权限
        field.setAccessible(true);
        //操作属性
        field.set(p,"男");
        //获取值
        Object obj = field.get(p);
        System.out.println(obj);
        System.out.println(p);
    }
}

6.MethodTest

package com.imooc.reflect.test;

import org.junit.Test;

import java.lang.reflect.Method;

public class MethodTest {
    @Test
    /**
     *测试公有方法
     */
    public void demo1() throws Exception {
        //获得Class
        Class class1 = Class.forName("com.imooc.reflect.test.Person");
        //实例化对象
        Person person = (Person) class1.newInstance();
        //获得公有的无参方法
        Method method = class1.getMethod("eat");
        //调用该方法
        method.invoke(person);
    }

    @Test
    /**
     *测试私有方法
     */
    public void demo2() throws Exception {
        //获得Class
        Class class1 = Class.forName("com.imooc.reflect.test.Person");
        //实例化对象
        Person person = (Person) class1.newInstance();
        //获得方法
        Method method = class1.getDeclaredMethod("run");
        //设置私有方法访问权限
        method.setAccessible(true);
        //调用方法
        method.invoke(person);
    }

    @Test
    /**
     *测试私有的带参数的方法
     */
    public void demo3() throws Exception {
        //获得Class
        Class class1 = Class.forName("com.imooc.reflect.test.Person");
        //实例化对象
        Person person = (Person) class1.newInstance();
        //获得私有的带参数的方法
        Method method = class1.getDeclaredMethod("studt", String.class);
        //设置私有方法的访问权限
        method.setAccessible(true);
        //执行私有的带参数的方法
        method.invoke(person,"张三");
    }
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值