Java反射(1)-基础篇

概述

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)-基础篇)