Java反射

声明:本文记录基于 JDK 8(8u211)的继承使用规则如果存在错误,请发邮件至2623574740@qq.com 联系我
创作时间:2023-09-16 17:00:21
创作情况:失业第46天,地处成都金牛区
创作者:一口吃不成胖子

反射

准备工作,以供对照描述与代码,想看结论直接到文末尾

父类

package com.beans;
/**
 * 抽象父类 Animal
 *
 * */
abstract class Animal {
    public String AnimalName;
    public Integer AnimalAge;
    public void desc(){
        System.out.println(this.AnimalName+"---"+this.AnimalAge);
    }
    abstract public void bark();
}

子类

package com.beans;

public class Cat extends Animal {
    public Cat(){
        
    }
    private Cat(String petName){
        this.petName = petName;
    }
    private Cat(Double price){
        this.price = price;
    }
    public Cat(String petName,Double price){
        this.petName = petName;
        this.price = price;
    }

    private String petName;
    private Double price;
    @Override
    public void bark() {
        System.out.println("喵");
    }

    public void catDesc(){
        System.out.println(this.AnimalName+"+++"+this.AnimalAge);
    }
}

获取类

  • Class.forName(全类名)

  • 类名.class

Class animalClass = Class.forName("com.beans.Cat");
class catClass = Cat.class;

获取构造器

  • getDeclaredConstructors():获取本类所有构造器
  • getDeclaredConstructor(参数类...):获取本类所有构造器的某一个
  • getConstructors():获取本类中public修饰的构造器
  • getConstructor(参数类...):获取本类public修饰的构造器中的符合参数的顺序和类型构造器
  • newInstance(参数...):调用构造器实例化对象
Constructor con = animalClass.getConstructor(null);//获取指定的且被public修饰的构造方法
Cat miao = (Cat) con.newInstance(null);// 实例化对象

Constructor[] constructors = animalClass.getDeclaredConstructors();//获取所有构造对象,包括被private修饰的
for (Constructor constructor : constructors) {
    System.out.println(constructor.getParameterCount());
    Parameter[] parameters = constructor.getParameters();//获取构造方法参数
    for (Parameter parameter : parameters) {
         System.out.println(parameter.getName()+"--"+ parameter.getType());
    }
}

获取方法

  • getDeclaredMethods():获取所有方法,不包括继承父类的,但包括重写的。
  • getDeclaredMethod(方法名,参数类...):获取所有方法中的某个方法,不包括继承父类的,但包括重写的。
  • getMethods():获取所有public修饰的方法,包括继承父类的public方法
  • getMethod(方法名,参数类...):获取public修饰的方法中的某个方法,包括继承父类的public方法
  • getParameters():获取方法的所有参数
  • invoke(对象,参数...):执行对象
  • setAccessible(布尔):放开/禁止可访问权限(仅类中是public修饰的方法不用调用此方法,访问继承于父类中是public修饰的方法则需要调用)
Method[] methods = animalClass.getDeclaredMethods();//获取所有方法
for (Method method : methods) {
	int parameter_count = method.getParameterCount();//获取参数个数
	System.out.println(method.getName()+"---"+parameter_count);
    for (Parameter parameter : parameters) {
         String para_name = parameter.getName();//并不是真正的参数名,而是arg0,arg1...
         Type type = parameter.getType();
         System.out.println(para_name+"---"+type.getTypeName());//打印参数名和参数类型
    }
    
	Parameter[] parameters = method.getParameters();//获取参数
    if ( parameters.length == 0){
           method.invoke((Cat)animalClass.newInstance());//执行方法
    }
}

获取属性

  • getFields():获取所有public修饰的属性,包括继承于父类的。
  • getField(属性名):获取public修饰的属性中某个属性,包括继承于父类的。
  • getDeclaredFields():获取所有属性,不包括父类的。
  • getDeclaredField(属性名):获取所有属性中某个属性,不包括父类的。
  • set(对象,值):为某一个对象的该属性赋值
  • get(对象):获取对象的该属性值。
  • setAccessible(布尔):放开/禁止可访问权限(仅类中是public修饰的属性不用调用此方法,访问继承于父类中是public修饰的属性则需要调用)
Field[] fields = animalClass.getFields();
for (Field field : fields) {
     System.out.println(field.getName()+"---"+field.getType());
}
Field f = animalClass.getField("AnimalName");// 获取public修饰的AnimalName属性
Cat cat = (Cat) animalClass.newInstance();
f.setAccessible(true);// 放开权限,因为AnimalName是从父类中继承的public属性,需要打开访问权限
f.set(cat,"小毛");//赋值
System.out.println(f.get(cat));//取值
posted @ 2023-09-17 20:13  勤匠  阅读(1)  评论(0编辑  收藏  举报