Java反射机制

JAVA反射机制

      JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

获取Class对象有三种方式:

1.通过Object类的getClass()方法。例如:

Class c1 = new String("").getClass();

2.通过Class类的静态方法——forName()来实现:

Class c2 = Class.forName("MyObject");         //传入一个类名的字符串

3.如果T是一个已定义的类型的话,在java中,它的.class文件名:T.class就代表了与其匹配的Class对象,例如:

Class c3 = Manager.class;

Class c4 = int.class;

Class c5 = Double[].class;

了解类的信息

获得本类声明的方法

getName();      //这个方法就是返回String形式的该类的简要描述

获得所有方法

ClassdogClazz = Dog.class;

Method[] methods = dogClazz.getMethods();         //获得所有公共的方法

Method[] methods2 = dogClazz.getDeclaredMethods();            //获得自己定义的方法

获得父类信息

Class superClazz = chineseClazz.getSuperclass();

获得接口信息

Class[] interfaceClazz = chineseClazz.getInterfaces();

根据Class对象创建instance

方法1

ClassdogClazz = Dog.class;

Object o = dogClazz.newInstance();           //Dog类中必须有无参的构造函数

方法2

Constructor c = dogClazz.getConstructor(new Class[]{String.class, int.class});      //根据Dog类中的构造函数,创建一个构造器。

Dog o2 = (Dog) c.newInstance("xiaohei",3);

操作成员变量

ClassdogClazz = Dog.class;

Object o = dogClazz.newInstance();

Field[] fields = dogClazz.getFields();

for(Field f: fields){

System.out.println(f.getName());

}

Field field = dogClazz.getField("name");

field.set(o, "zhangsan");

Field field2 = dogClazz.getDeclaredField("age");

field2.setAccessible(true);                     //否则不能访问到Dog类中的私有变量

field2.set(o, 3);

调用成员方法

ClassdogClazz = Dog.class;

Object o = dogClazz.newInstance();

Method m = dogClazz.getMethod("bark", new Class[]{Dog.class});       //传入方法名,和参数

m.invoke(o, new Object[]{o});                 //调用方法

你可能感兴趣的:(Java反射机制)