笔记:反射

1.反射定义

在运行过程中,对于任意一个类,都能够知道这个类的所有属性和方法;

对于任意一个对象,都能够调用他的任意方法和属性;

这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。

2.相关信息

名字用途
Class代表类的实体,在运行的java程序中表示接口和类
Field成员变量,类的属性
Method成员函数,类的方法
Constructor构造方法

以此类为例子进行反射演练;

package review;

/**
 * @author lz先生
 * @Date: 2020/3/18/018
 */
public class Car {
    private String name;
    private int age;
    private String color;

    public Car() {
    }

    public Car(String name, int age, String color) {
        this.name = name;
        this.age = age;
        this.color = color;
    }

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }

    public String remove(String name, Double speed) {
        System.out.println("remove方法执行了" + name + speed);
        return name + speed;
    }

    @Override
    public String toString() {
        return "Car{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", color='" + color + '\'' +
                '}';
    }
}

3.类的实例化,得到class对象

两种方式

  • 一种通过Class.forName(“全类名”)获得

  • 一种通过Car.class获得;

/*1.实例化方式一*/
Class<?> name = Class.forName("review.Car");
System.out.println("1.Class.forName(\"包名.类名\")创建的实例化:"+name);

/*2.实例化方式二*/
Class<Car> carClass = Car.class;
System.out.println("2.Car.class的实例化:"+carClass);

结果

1.Class.forName("包名.类名")创建的实例化:class review.Car
2.Car.class的实例化:class review.Car

4.创建新的实例newInstance

  • 通过class对象创建新实例;

  • 此外也可通过构造函数创建实例;

/*3.newInstance默认构造方法创建无参实例*/
Object obj = carClass.newInstance();
System.out.println("3.未赋值的实例:"+obj);

/*给实例设值*/
((Car) obj).setAge(18);
((Car) obj).setColor("红色");
((Car) obj).setName("小奔");
System.out.println("赋值后的实例:" + obj);
if (obj instanceof Car) {
    System.out.println("是Car的实例");
}

结果

3.未赋值的实例:Car{name='null', age=0, color='null'}
赋值后的实例:Car{name='小奔', age=18, color='红色'}
是Car的实例

5.构造函数constructors

通过class对象获得构造函数,无需创建实例;

/*4.得到构造函数*/
/*getConstructors得到所有的public构造函数*/
/*getDeclaredConstructors得到所有类型的构造函数*/
Constructor<?>[] constructors = name.getConstructors();
System.out.println("4.到所有的public构造函数:");
for (Constructor<?> constructor : constructors) {
    System.out.println(constructor);
}

/*5.指定参数列表来获得的指定的构造函数*/
Constructor<?> constructor = name.getDeclaredConstructor(String.class, Integer.TYPE, String.class);
System.out.println("5.指定参数列表来获得的指定的构造函数:" + constructor);
/*将此构造的可访问性修改为可访问的*/
constructor.setAccessible(true);
Object instance = constructor.newInstance("李白", 456, "桃花");
System.out.println("构造函数创建实例:" + instance);

结果

4.到所有的public构造函数:
public review.Car()
public review.Car(java.lang.String,int,java.lang.String)
5.指定参数列表来获得的指定的构造函数:public review.Car(java.lang.String,int,java.lang.String)
构造函数创建实例:Car{name='李白', age=456, color='桃花'}

6.成员变量,属性

/*6.得到成员变量*/
/*getFields得到所有的public成员变量*/
/*getDeclaredFields得到所有类型的成员变量*/
System.out.println("6.getDeclaredFields得到所有类型的成员变量:");
Field[] declaredFields = name.getDeclaredFields();
for (Field field : declaredFields) {
    System.out.println(field);
}

结果

6.getDeclaredFields得到所有类型的成员变量:
private java.lang.String review.Car.name
private int review.Car.age
private java.lang.String review.Car.color

7.成员函数,方法

  • 得到成员函数,用class对象,无需创建新的实例

  • invoke执行成员函数,却需要输入一个实例;需要创建一个新的实例输入

/*7.获得成员函数*/
/*getMethods所有public成员函数*/
/*getDeclaredMethods得到所有类型的成员函数*/
System.out.println("7.getDeclaredMethods得到所有类型的成员函数:");
Method[] methods = name.getDeclaredMethods();
for (Method method : methods) {
    System.out.println(method);
}

/*8.指定名字参数获得成员函数*/
Method remove = name.getDeclaredMethod("remove", String.class, Double.class);
System.out.println("8.指定名字参数获得成员函数:" + remove);
Object invoke = remove.invoke(obj, "独孤", 20.3);
System.out.println("指定名字参数获得成员函数的返回值:" + invoke);

结果:

7.getDeclaredMethods得到所有类型的成员函数:
public java.lang.String review.Car.remove(java.lang.String,java.lang.Double)
public java.lang.String review.Car.toString()
public java.lang.String review.Car.getName()
public void review.Car.setName(java.lang.String)
public void review.Car.setColor(java.lang.String)
public void review.Car.setAge(int)
public int review.Car.getAge()
public java.lang.String review.Car.getColor()
8.指定名字参数获得成员函数:public java.lang.String review.Car.remove(java.lang.String,java.lang.Double)
remove方法执行了独孤20.3
指定名字参数获得成员函数的返回值:独孤20.3
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值