反射

作者: Anwfly | 来源:发表于2020-07-26 14:30 被阅读0次

一、 注解的定义
反射是通过class文件对象获取java类的构造方法、成员方法、属性、静态代码块等。
二、使用

  1. 获取字节码文件
//1.通过Object的getClass()方法
Class cls = person.getClass()

//2.通过数据类型的静态属性class
Class cls = Person.class
    
//3.通过Class类的静态方法forName()
Class cls = Class.forName("com.jiyun.Person");
  1. 通过反射获取无参构造、有参构造、私有构造方法并使用
    实体类:
public class Dog {
    private String name;
    public String color;
    public static String des = "狗有四条腿,长舌头,汪汪叫";

    public Dog() {
    }

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

    public String getName() {
        return name;
    }

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

    public void show() {
        System.out.println("我是" + name);
    }

    public int cal(int a, int b) {
        return a + b;
    }

    public static void profile() {
        System.out.println("狗是人类的朋友");
    }
}

(1)反射获取无参构造

代码:

//反射获取无参构造两种方式
Constructor<?> constructor = cls.getConstructor();
Constructor<?> constructor = cls.getConstructor(null);

案例:

public class Test {
    public static void main(String[] args) throws Exception {
        Class<Dog> cls = Dog.class;
        //1.获取无参构造方法并使用
        Constructor<?> constructor1 = cls.getConstructor();
//        Constructor<?> constructor1 = cls.getConstructor(null);

        //通过无参构造方法生成对象:
        Object obj1 = constructor1.newInstance();
//        Object obj1 = constructor1.newInstance(null);
        Dog dog = (Dog) obj1;
        dog.setName("哈士奇");
        dog.show();
    }
}

(2) 反射获取有参构造方法

代码:

//反射获取有参构造方法
Constructor<?> constructor = cls.getConstructor(new Class[]{String.class});

案例:

public class Test {
    public static void main(String[] args) throws Exception {
        Class<Dog> cls = Dog.class;
        //2.获取有参构造方法并使用
        Constructor<?> constructor = cls.getConstructor(new Class[]{String.class});

        //通过无参构造方法生成对象:
        Object obj = constructor.newInstance(new Object[]{"哈士奇"});
        Dog dog = (Dog) obj;
        dog.show();
    }
}

(3) 反射获取私有构造方法

代码:

//反射获取私有构造方法
Constructor<?> constructor = cls.getDeclaredConstructor(); 

案例:

public class Test {
      public static void main(String[] args) throws Exception {
           Class<Dog> cls = Dog.class;
   
           //获取私有构造方法并使用
           Constructor<?> constructor = cls.getDeclaredConstructor();
   
           //通过无参构造方法生成对象:
           constructor.setAccessible(true);
           Object obj = constructor.newInstance();
           Dog dog = (Dog) obj;
           dog.setName("哈士奇");
           dog.show();
       }
 }
  1. 通过反射获取无参无返回值、带参有返回值成员方法并使用
    (1)获取无参无返回值的方法
    代码:

    //获取无参无返回值的方法
    Method mth = cls.getMethod("show");
    Method mth = cls.getMethod("show",null);
    

    案例:

    public class Test {
        public static void main(String[] args) throws Exception {
            Class<Dog> cls = Dog.class;
            Constructor<?> constructor1 = cls.getConstructor();
            Object obj = constructor1.newInstance();
            Dog dog = (Dog) obj;
    
            //获取无参无返回值的方法
            Method mth = cls.getMethod("show");
    //        Method mth = cls.getMethod("show","哈士奇");
    
            //调用show方法:
            dog.setName("哈士奇");
    //        mth.invoke(obj, nul);
            mth.invoke(dog);
    }
    

(2)获取有参有返回值的方法

代码:

//获取有参有返回值的方法
Method mth = cls.getMethod("cal", new Class[]{int.class,int.class});

案例:

public class Test {
    public static void main(String[] args) throws Exception {
        Class<Dog> cls = Dog.class;
        Constructor<?> constructor1 = cls.getConstructor();
        Object obj = constructor1.newInstance();

        //2.获取有参有返回值的方法
        Method mth = cls.getMethod("cal", new Class[]{int.class,int.class});

        //调用cal方法:
        Object result = mth.invoke(obj,new Object[]{2,6});
        int sum = (int) result;
        System.out.println(sum);
    }
}

(3)获取无参无返回值静态方法

代码:

//获取无参无返回值静态方法 
Method mth = cls.getMethod("profile");
Method mth = cls.getMethod("profile",null);

案例:

public class Test {
    public static void main(String[] args) throws Exception {
        Class<Dog> cls = Dog.class;

        //获取无参无返回值静态方法
        Method mth = cls.getMethod("profile");
//        Method mth = cls.getMethod("profile",null);

        //调用静态方法
        mth.invoke(null);
//        mth.invoke(null,null);
    }
}
  1. 通过反射获取成员变量并使用
    (1)获取非私有成员变量
    代码:

    //获取非私有成员变量 
    Field field = cls.getField("color");
    

    案例:

    public class Test {
        public static void main(String[] args) throws Exception {
            Class<Dog> cls = Dog.class;
            Constructor<?> constructor1 = cls.getConstructor();
            Object obj = constructor1.newInstance();
    
            //1.获取非私有成员变量
            Field field = cls.getField("color");
    
            //给非私有成员变量赋值:
            field.set(obj, "yellow");
            //获取非私有成员变量的值:
            Object color = field.get(obj);
            System.out.println("狗的颜色是:"+color);
        }
    }
    

(2)获取私有成员变量
代码:

//获取私有成员变量 
Field field = cls.getDeclaredField("name");

案例:

public class Test {
    public static void main(String[] args) throws Exception {
        Class<Dog> cls = Dog.class;
        Constructor<?> constructor1 = cls.getConstructor();
        Object obj = constructor1.newInstance();

        //2.获取私有成员变量
        Field field = cls.getDeclaredField("name");

        //给私有成员变量赋值:
        field.setAccessible(true);
        field.set(obj, "大黄");

        //获取私有成员变量的值:
        field.setAccessible(true);
        Object name = field.get(obj);
        System.out.println("狗的名字是:" + name);
    }
}

(3)获取静态成员变量

代码:

//获取私有成员变量 
Field field = cls.getField("des");

案例:

public class Test {
    public static void main(String[] args) throws Exception {
        Class<Dog> cls = Dog.class;

        //获取静态成员变量
        Field field = cls.getField("des");

        //给静态成员变量赋值:
        field.set(null, "啦啦啦");
        //获取非私有成员变量的值:
        Object des = field.get(null);
        System.out.println("狗得描述:" + des);
    }
}

相关文章

  • Java基础之反射

    Java基础之反射 反射基本介绍 反射的使用通过反射调用属性和方法通过反射获取配置文件 反射基本介绍 Java反射...

  • 镜面反射矩阵的推导

    镜面反射是以镜面作为反射平面,实物与反射物到反射平面的距离相等,实物与反射物方向相反,所以,反射矩阵由反射平面确定...

  • reflect.go包学习_之二 指针操作提高反射性能 反射应用

    reflect.go包学习_之二 指针操作提高反射性能 反射应用 反射创建实例 反射信息、反射调用方法、反射修改值...

  • Java互联网公司-经典面试题附答案

    基础:Java 反射?反射有什么缺点?你是怎么理解反射的(为什么框架需要反射)?优点:反射具有解耦性,缺点:反射属...

  • Java反射与joor反射库的使用

    java原生反射的使用 反射构造对象 反射方法 反射字段 joor反射库的使用 github:https://gi...

  • Java反射

    什么是反射? 反射的作用? 反射性能优化?

  • 反射三定律

    反射第一定律:反射可以将interface类型变量转换成反射对象 反射第二定律:反射可以将反射对象还原成inter...

  • 反射

    1.反射是什么?反射的定义,概念 2.为什么要学反射? 3.怎么使用反射?反射的使用

  • 一周岁前做好两件事,孩子就不会语言迟缓,保证口齿伶俐

    与语言发展相关的原始反射有四个:张口反射、足跖反射、抓握反射和手拉反射,每个反射的发生、发展和整合都是次第进行的,...

  • 面试官问go反射第一弹

    目录 反射概念 reflect包 反射类型(Type)和种类(Kind) 反射类型(Type)使用 反射类型对象(...

网友评论

      本文标题:反射

      本文链接:https://www.haomeiwen.com/subject/vlsyfctx.html