黑马程序员-Java的反射学习笔记

来源:互联网 发布:流量控制软件电脑 编辑:程序博客网 时间:2024/04/28 15:09

——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-


反射介绍

反射,就是把Java类中的各种成分映射成相应的Java类。
程序要运行期间通过类名就能知道类的所有信息,构造函数、方法、成员变量。
Java中,一个字节码文件被类加载器加载进内存中后是一个Class类的实例,Class中有返回成员方法、变量、构造函数类的方法。Java中,类中的方法、变量都可以用类来表示,Method类表示成员方法、Field类表示类的成员变量。Constructor类表示类的构造函数。

反射的可以干什么

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

Java中,通过下面的类实现反射机制:

ClassFiledMethodConstructorArray

Class类
实现反射的基础,Java源代码通过编译后生成字节码文件,*.class文件。通过类加载器加载进内存后,就是Class类的一个实例。Class类就是描述类的一个类。类有成员方法、成员属性、构造函数。Class类的实例就是加载进内存后的字节码。

获取Class实例的4种方法

  1. 通过运行时类本身的属性获取
    假设有一个Person类,通过类的.class属性获取

    Class clazz = Person.class;
  2. 通过运行时类的对象的方法获取

    Person p = new Person():Class clazz = p.getClass();
  3. 通过Class类的静态方法获取

    String str = "hello,heima!";Class clazz  = Class.forName(str);
  4. 通过类的加载器

    Person p = new Person();ClassLoader  clalod = this.getClass().getClassLoader();clalod.loadClass(p);

通过运行时类创建对象
通过创建对应的运行时对象,调用运行时类的newInstance()方法,调用newInstance方法,对调用运行时类的空参数构造器。构造器的权限要足够。
假设com.Reflection包下有Person类。Person类的空参数构造器会打印:“空参数构造器”字符串。

    String str = "com.Reflection.Person";    Class clazz = Class.forName(str);    Object obj = clazz.newInstance();    Person p = (Person)obj;    System.out.println(p);    输出结果:  空参数构造器                Person [name=null, age=0]

通过反射获取类的完整结构

Person类如下:

获取成员变量
通过getField方法获取到运行时类本身的一个成员属性,然后通过Field实例的
get方法获取属性的值。getField只能获取权限为public的成员属性。

Field getField();

public  static void test3() throws Exception{     String className = "com.Reflection.Person";     Class clazz = Class.forName(className);     Person p = new Person();     Field field  = clazz.getField("id");     //获取名字为id的成员属性     System.out.println( field.get(p));     //获取属性的值}

Field[] getFields();
获取运行时类本身和父类中声明权限为public的成员变量

public  static void test3() throws Exception{ String className = "com.Reflection.Creature"; Class clazz = Class.forName(className); Field f1[] = clazz.getFields(); for (int i = 0; i < f1.length; i++) {    System.out.println(f1[i]);    }}打印结果:    空参数构造器    public double com.Reflection.Creature.weight    public int com.Reflection.Person.id

获取运行时类本身中声明权限为public的所有成员变量

Field[] getDeclaredFields();

Field f2[] = clazz.getDeclaredFields();for (int i = 0; i < f2.length; i++) {    System.out.println(f2[i]);}打印结果:    public double com.Reflection.Creature.weight

获取属性的所有内容
getName()

     System.out.println(f1[i].getName());     打印为:weight

获取权限修饰符:
getModifiers()

System.out.println(Modifier.toString(f1[i].getModifiers()));打印为:public        public

getType() 返回属性的类型的Class对象

    System.out.println(f1[i].getType());

获取返回值类型:
Class getReturnType();

    Class returnType = f1[i].getReturnType();    System.out.println(returnType.getName());

获取形参列表

        Class[] returnClass = fMethod.getParameterTypes();

获取构造方法
一个Constructor类实例代表一个构造方法。

    Constructor constructor = Person.class.getConstructor();    Person p1 = (Person) constructor.newInstance();    //通过调用Constructor的实例的newInstance方法,就像调用    //Person类的构造方法一样,创建了Person的一个实例。    System.out.println(p1.getName());

newInstance方法的参数个数是可变参数,比如调用有参构造方法就是
getConstructor(Class

0 0
原创粉丝点击