美文网首页
Java反射(1)-基础篇

Java反射(1)-基础篇

作者: 贾大师 | 来源:发表于2021-03-30 17:40 被阅读0次

概述

Java的反射(reflection)机制是指在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用任意一个对象的属性和方法。这种动态获取程序信息以及动态调用对象的功能称为Java语言的反射机制。

1.反射的作用?
2.三种获取Class对象的方法
3.获取构造器实例化对象和属性信息
4.获取包信息
5.获取方法
6.小结

1-反射的作用

在运行时判定任意一个对象所属的类
在运行时构造任意一个类的对象
在运行时判定任意一个类所具有的成员变量和方法
在运行时调用任意一个对象的方法

2-三种获取Class对象的方式
  //第一种
  Class<?> class1 = new Dog().getClass();
  //第二种
  Class<?> class2 = Dog.class;
  //第三种
  Class<?> class3 = Class.forName("com.zlqf.myview.Dog");

打印三种方式获取的Class,运行结果如下:
class1--》class com.zlqf.myview.Dog
class2--》class com.zlqf.myview.Dog
class3--》class com.zlqf.myview.Dog
从打印结果可以看出,三种不同的方式都拿到了同一个结果。

3-获取构造器实例化对象和属性信息
//Dog类
public class Dog {
    private String name = "大黄";
    private String color = "黄色";

    public Dog(){}
    public Dog(String name,String color){
        this.name = name;
        this.color = color;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getColor() {
        return color;
    }
    public void setColor(String color) {
        this.color = color;
    }
    public void printInfo(){
        Log.e("pp","我的信息:名字:"+name+" 毛色:"+color);
    }
}
        //获取所有的构造器
        Constructor<?>[] constructors = class1.getConstructors();
        //获取某个构造器
        Constructor<?> constructor = class1.getConstructor(String.class,String.class);
        //得到实例化对象
        Dog dog = (Dog) constructor.newInstance("大黑","黑色");
        dog.printInfo();

        //获取color属性
        Field color = class1.getDeclaredField("color");
        //跳过安全检测
        color.setAccessible(true);
        //将dog对象中的color属性值改为【白色】
        color.set(dog,"白色");
        dog.printInfo();

代码简单易懂,通过反射得到构造器,然后实例化出Dog类对象dog。通过Class得到color属性,由于该属性是private(私有的),所以需要setAccessible(true)跳过安全检查,然后就可以拿到属性信息,并进行更改操作。
打印结果如下:
我的信息:名字:大黑 毛色:黑色
我的信息:名字:大黑 毛色:白色

4-获取包信息
  //获取包信息
  Class<?> class2 = Dog.class;
  Package mPackage = class2.getPackage();
  //包名
  mPackage.getName();
5-获取方法
  Class<?> class4 = Dog.class;
  //获取构造器
  Constructor<?> constructor4 =     class1.getConstructor(String.class,String.class);
  //得到实例化对象
  Dog dog4 = (Dog) constructor.newInstance("大黑","黑色");
  //获取printInfo方法
  Method method = class1.getMethod("printInfo");
  //调用获取printInfo方法
  method.invoke(dog4);
  //加上String.class
  Method method1 = class1.getMethod("printInfo",String.class);
  method1.invoke(dog4,"带参数");

如果printInfo方法需要传入参数,则需要getMethod中声明,比如
两次结果输入如下
我的信息:名字:大黑 毛色:黑色
我的信息:名字:大黑 毛色:黑色带参数

6-小结

反射可以赋予JVM动态编译的能力,提升服务器性能,可以使得我们的程序更灵活,非常有用。

相关文章

  • Java反射(1)-基础篇

    概述 Java的反射(reflection)机制是指在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个...

  • java 反射进阶

    1.java反射基础 2.java反射进阶 上一节介绍了反射基础,本节介绍更深入的反射概念。 1.获取不到Clas...

  • Java基础:注解

    系列阅读 Java基础:类加载器 Java基础:反射 Java基础:注解 Java基础:动态代理 1. 概述 注解...

  • Java高级知识

    反射 sczyh30 深入解析Java反射(1) - 基础深入解析Java反射(2) - invoke方法深入探究...

  • Java基础:反射

    反射注解动态代理相关阅读 Java基础:类加载器 Java基础:反射 Java基础:注解 Java基础:动态代理 ...

  • java 反射基础

    1.java反射基础 2.java反射进阶 反射的两个显著的作用 反编译: .class —> .java 通过...

  • Java基础:类加载器

    系列阅读 Java基础:类加载器 Java基础:反射 Java基础:注解 Java基础:动态代理 1. 什么是类加...

  • 在Alibaba广受喜爱的“Java突击宝典”简直太牛了

    0-1年:夯实基础 1.Java基础(Java异常分类及处理+Java反射+Java注解+Java内部类+Java...

  • Java基础之反射

    Java基础之—反射(非常重要)Java中反射机制详解Java进阶之reflection(反射机制)——反射概念与...

  • Java基础篇-反射

    编程中直接用到反射的地方很少,不过研究Spring、mybatis等框架会发现,反射是实现这些框架的基础。让我们一...

网友评论

      本文标题:Java反射(1)-基础篇

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