反射

反射

通过反射我们可以更好的理解java面向对象的特性

例如:

Method eat = clazz1.getMethod("eat");

此处eat对象就相当于下面的方法

public void eat() {
        System.out.println("I am eating...");
    }

Dog类

package cf.duanzifan;

public class Dog implements Animal{
    //字段
    public String name;		//公有的字段
    private int age;		//私有的字段

    //方法
    @Override
    public void eat() {
        System.out.println("I am eating...");
    }

    @Override
    public void run() {
        System.out.println("I am running...");

    }
    
    public void eat(String food){
        System.out.println("I am eating" + food);
    }
    
    //构造方法
    public Dog() {
    }

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

    //Getter、Setter
    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;
    }
}

用反射得到Dog类对象,并用 类对象 的一些方法对Dag进行操作

  • 获得类对象
package cf.duanzifan;

import java.lang.reflect.Field;

public class DogReflect {
    public static void main(String[] args) {
        Class clazz = Class.forName("cf.duanzifan.Dog");  //通过全类名来获取类对象
        Class clazz = dog.getClass();					//通过对象来获取类对象
        Class clazz = Dog.class;					    //通过类来获取类对象
        System.out.println(clazz);						//class cf.duanzifan.Dog
}
  • 通过类对象创建一个对象
Object dog = clazz1.newInstance();

字段操作

  • 通过类对象对字段的一些操作
//getField
Field name = clazz.getField("name");		 //getField()方法只能获取 公有的字段
System.out.println(name);					//public java.lang.String cf.duanzifan.Dog.name

//getDeclaredField
Field age = clazz.getDeclaredField("age");	 //getDeclaredField()方法可以获取 私有和公有的字段
System.out.println(age);                     //private int cf.duanzifan.Dog.age

//getFields
Field[] fields = clazz1.getFields();		//getFields()方法,可以获得所有public的字段
for(Field field : fields){
    System.out.println(field);
}

//getDeclaredFields
Field[] declaredFields = clazz1.getDeclaredFields();	//getDeclaredFields可以获得所有的字段
for(Field field : declaredFields){
    System.out.println(field);
}
  • Field 字段的一些方法
Field name = clazz.getField("name");
//public 字段的设值与取值
name.set(dog,"xiaohei");
Object name1 = name.get(dog);
System.out.println(name1);			//xiaohei
//获得字段的类型
System.out.println(name.getType());	//class java.lang.String

//private 字段的设值与取值
//暴力注入
age.setAccessible(true);			//授权
age.set(dog,3);
Object age1 = age.get(dog);
System.out.println(age1);			//3
//获得字段的类型
System.out.println(age.getType());	 //int

方法操作

  • 通过类对象对方法的一些操作
Method eat = clazz1.getMethod("eat");				  //只传入方法名,默认是获得无参数的方法
Method eat1 = clazz1.getMethod("eat", String.class);   //传入方法名和参数的类对象
  • Method的一些方法
Method eat = clazz1.getMethod("eat");
//invoke是执行方法
eat.invoke(dog);									//I am eating...
eat1.invoke(dog,"meat");							//I am eating meat
//getParameterTypes是获得方法参数类型
Class<?>[] parameterTypes = eat1.getParameterTypes();
for(Object type : parameterTypes){
    System.out.println(type);					//class java.lang.String
}

运行时类

image-20200622144232931

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值