首页 > 编程语言 > 详细

原来你是这样的JAVA[06]-反射

时间:2021-04-01 00:33:16      阅读:25      评论:0      收藏:0      [点我收藏+]

1.JVM为每个加载的class及interface创建了对应的Class实例来保存class及interface的所有信息;
获取一个class对应的Class实例后,就可以获取该class的所有信息;
通过Class实例获取class信息的方法称为反射(Reflection);
JVM总是动态加载class,可以在运行期根据条件来控制加载class。

2.Java的反射API主要用于在运行过程中动态生成类、接口或对象等信息,其常用API如下。

  • Class类:用于获取类的属性、方法等信息。
  • Field类:表示类的成员变量,用于获取和设置类中的属性值。
  • Method类:表示类的方法,用于获取方法的描述信息或者执行某个方法。
  • Constructor类:表示类的构造方法。
public class ReflectTest {
    public static void main(String[] args) {
        Class class1 = String.class;
        printClassInfo(class1);

        Class cls2 = "hello".getClass();
        printClassInfo(cls2);

        Class cls3 = String[].class;
        printClassInfo(cls3);

        //true,指向同一个实例
        System.out.println("class1 == cls2? "+(class1 == cls2));
    }

    private static void printClassInfo(Class c) {
        System.out.println("getName()=" + c.getName());
        System.out.println("getSimpleName()=" + c.getSimpleName());
        System.out.println("isInterface()=" + c.isInterface());
        System.out.println("isEnum()=" + c.isEnum());
        System.out.println("isArray()=" + c.isArray());
        System.out.println("isPrimitive=" + c.isPrimitive());
    }
}

3.Class类提供了以下几个方法来获取字段:

  • Field getField(name):根据字段名获取某个public的field(包括父类)
  • Field getDeclaredField(name):根据字段名获取当前类的某个field(不包括父类)
  • Field[] getFields():获取所有public的field(包括父类)
  • Field[] getDeclaredFields():获取当前类的所有field(不包括父类)
  • Field.setAccessible:成员变量为private,必须进行此操作。
class Student extends Person {
    public int score;
    private int grade;
}

class Person {
    public String name;
}

首先尝试访问共有和私有变量:

private static void method() throws NoSuchFieldException {
        Class cls = Student.class;
        System.out.println(cls.getField("score"));
        System.out.println(cls.getDeclaredField("score"));
        //获取私有方法报错
//        System.out.println(cls.getField("grade"));
        System.out.println(cls.getDeclaredField("grade"));
    }

使用setAccessible,访问私有成员变量:

private static void privateField() throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException, NoSuchFieldException {
        Class cls = Class.forName("com.cathyjava.j2se.reflect.Student");
        Student student = (Student) cls.getDeclaredConstructor().newInstance();
        Field field = cls.getDeclaredField("grade");
        field.setAccessible(true);
        field.set(student, 2);
    }

原来你是这样的JAVA[06]-反射

原文:https://www.cnblogs.com/janes/p/14603333.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!