Java笔记-Java反射(二)

上一篇文章介绍了反射的基本概念以及获取类相关信息的反射API,这一章节主要记录如何对类的成员进行操做的相关反射API。java

操做类成员的类

反射API中提供了以下接口,用于对类的成员进行操做。bash

java.lang.reflect.Member
复制代码

该接口主要有如下三个实现类,用于对类成员中的字段,方法和构造器进行操做。 框架

Tips: 在Java SE 7的手册中指出,构造器不是类的成员,这和Member的实现类想表达的意思不一样。函数

操做字段

字段拥有类型以及值,使用如下类可以获取类中字段的类型信息,获取字段的值以及对字段进行赋值操做。工具

java.lang.reflect.Field
复制代码

操做方法

方法有返回值,参数,而且可能会抛出异常,使用如下类能够获取方法参数以及返回值的类型信息,也能够调用指定对象的方法。spa

java.lang.reflect.Method
复制代码

操做构造器

使用以下类能够操做类的构造器,提供与操做method相似的方法,但有如下两点例外,构造器没有有返回值,而且对构造器的调用能够建立指定类的实例。code

java.lang.reflect.Constructor
复制代码

实际操做

获取字段类型

public class Main {

	public static String abc = "123";
	private static List<String> a;

	public static void main(String[] args) throws NoSuchFieldException {
		Class c = Main.class;
		Field field = c.getField("abc");
		Field field1 = c.getDeclaredField("a");

		System.out.println(field.getType());
		System.out.println(field.getGenericType());

		System.out.println();

		System.out.println(field1.getType());
		System.out.println(field1.getGenericType());
	}
}
复制代码

如上代码所示,获取对应字段的Field类,具体使用区别在上一张文末介绍了。 getType直接输出这个字段的类类型。 getGenericType直接输出这个字段的类型,若是是泛型字段的话,输出带有泛型实际参数的类型,若是不是泛型则会在内部调用getType。结果以下所示。cdn

class java.lang.String class java.lang.String interface java.util.List java.util.List<java.lang.String> 复制代码

获取字段修饰符

类中字段有许多的修饰符,好比 public,private,transient等,java提供了API获取类的修饰符,不过获取出来的是一个int型数字,好在java提供了Modifier类对得到的整型进行判断,以下代码所示,有兴趣的能够对Modifier源码进行浏览。对象

public class Main {
    public static int a = 1;
    public static void main(String[] args) throws NoSuchFieldException {
        Class c = Main.class;
        Field field = c.getField("a");
        System.out.println(Modifier.isPublic(field.getModifiers()));
        System.out.println(Modifier.isStatic(field.getModifiers()));
    }
}
复制代码

读写字段值

反射能够对字段进行读写,以下代码所示,能够用过setX和getX方法对字段进行读写,不过要注意读写先后的类型是否匹配,否则会报异常。blog

private static int a = 1;

    public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
        Class c = Main.class;
        Field field = c.getDeclaredField("a");
        int b = field.getInt(Main.class);
        System.out.println(b);
        field.setInt(Main.class, 2);
        System.out.println(a);
        field.setFloat(Main.class, (float) 1.1);   // 报异常
    }
复制代码

操做方法和构造器

以后操做方法的类是Method,操做构造器的类是Constructor,经过这些API提供的get方法,能够得到方法和构造器的相关信息,所以在笔记里也再也不赘述。

构造器建立实例

构造器和方法的反射类不一样点在于,Constructor能够建立实例,代码以下所示。

public class Main {

    public Main() {
    }

    public static void main(String[] args) throws IllegalAccessException, InvocationTargetException, InstantiationException {
        Class c = Main.class;
        Constructor[] ctors = c.getConstructors();
        Constructor ctor = null;
        for (int i = 0; i < ctors.length; i++) {
            ctor = ctors[i];
            if (ctor.getGenericParameterTypes().length == 0)     // 须要找到默认构造函数建立实例
                break;
        }

        System.out.println(ctor.newInstance().getClass().getCanonicalName());
    }
}
复制代码

结尾

以上就是一些看反射API的一些记录,这个工具自己使用上仍是很简单的,但意义仍是比较大的,是不少框架存在的基础,下一篇以struts为例子,写一个小demo,展现反射在其中的运用。

相关文章
相关标签/搜索