java反射机制的使用

java中的反射机制

  • 定义
      JAVA反射机制是在运行状态中,对于任意一个类,都能够获取这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
      JAVA反射(放射)机制:“程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言”。
  • 功能
     1.在运行时判断任意一个对象所属的类
     2.在运行时构造任意一个类的对象
     3.在运行时判断任意一个类所具有的成员变量和方法
     4.在运行是获取泛型信息
     5.在运行时调运任意一个对象的成员变量和方法
     6.在运行时处理注解
     7.生成动态代理

java反射字节码对象方式:

方法 示例
对象名.getClass() stu.getClass();(前提条件是必须对象存在)
类名.class Student.class
Class.forName(“包名.类名”) Class.forName(“util.Student”)

Class 类的方法

方法 功能
newInstance() 创建此类的对象(实例化的类一定有无参数的构造函数,否则不能被实例化)
getField(String name) 返回此类的或者接口指定name的公共属性(返回值为Field类型)
getFields() 返回此类的或者接口所有的公共属性(返回值为Field类型的数组)
getMethod(String name, 类<?>… parameterTypes) 返回此类的或者接口指定name,指定参数的公共方法(返回值为Method类型)
getMethods() 返回此类的或者接口所有的公共方法(返回值为Method类型的数组)
getDeclaredField(String name) 返回此类的或者接口指定name的所有属性(返回值为Field类型)
getDeclaredFields() 返回此类的或者接口所有的属性(返回值为Field类型的数组)
getDeclaredMethod(String name, 类<?>… parameterTypes) 返回此类的或者接口指定name,指定参数的所有方法,parameterTypes参数的写法为:参数类型.class(返回值为Method类型)
getDeclaredMethods() 返回此类的或者接口所有的方法(返回值为Method类型的数组)

Filed类的方法

方法 功能
equals(Object obj) 将此 Field与指定对象进行比较
get(Object obj) 返回该表示的属性的值(返回值为Object,参数obj为指定的该对象)
setAccessible(boolean boo) 此方法为父类AccessibleObject的方法,赋予操作对象私有属性的权限,参数true为是,false为否
set(Object obj, Object value) obj为指定的该对象,方法的作用是设置该表示属性的值为value

Method类中的方法

方法 功能
equals(Object obj) 将此 方法与指定对象进行比较
getName() 返回该方法的名字(返回值为String)
invoke(Object obj, Object… args) 执行此方法,obj为指定该对象,args为需要的参数,

举例

Student类

public class Student {
    private String name;
    private int num;

    public Student(){

    }

    public Student(String name, int num) {
        this.name = name;
        this.num = num;
    }

    public String getName() {
        return name;
    }

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

    public int getNum() {
        return num;
    }

    public void setNum(int num) {
        this.num = num;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", num=" + num +
                '}';
    }
    
    public void play(int a){
        System.out.println("输出参数为"+a+"的方法");
    }
}

Class,Filed,Method某些方法的测试

public class text {
    public static void main(String[] args) {
        try {
            //根据反射创建Class对象
            Class cls = Student.class;
            //创建类Student的对象stu
            Student stu = (Student) cls.newInstance();
            //获取指定名字的私有属性
            Field field = cls.getDeclaredField("name");
            Field field1 = cls.getDeclaredField("num");
            //设置操作私有属性的权利
            field.setAccessible(true);
            field1.setAccessible(true);
            //设置私有属性的值
            field.set(stu,"张三");
            field1.set(stu,1);
            //获取指定名字的方法,及形参的写法
            Method method =  cls.getDeclaredMethod("toString",null);
            Method method1 = cls.getDeclaredMethod("play", int.class);
            //执行方法,参数为执行方法的对象
            System.out.println(method.invoke(stu));
            //执行方法,参数为执行方法的对象,及该方法需要的参数
            method1.invoke(stu,666);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

注:类中的方法只写了一些部分方法,日后有需要,即使补充。

发布了12 篇原创文章 · 获赞 7 · 访问量 4699

猜你喜欢

转载自blog.csdn.net/qq_30385099/article/details/100032672